机器学习基础--贝叶斯分类器
来源:互联网 发布:xss攻击 java 编辑:程序博客网 时间:2024/06/04 23:53
单纯的贝叶斯分类器很简单,基本上就是一个贝叶斯公式,要理解透彻贝叶斯分类器需要搞清楚两个概念
似然函数
基本上维基百科讲的很清楚,我这里在重复一下,可以直接去维基百科看
在数理统计学中,似然函数是一种关于统计模型中的参数的函数,表示模型参数中的似然性。似然函数在统计推断中有重大作用,如在最大似然估计和费雪信息之中的应用等等。“似然性”与“或然性”或“概率”意思相近,都是指某种事件发生的可能性,但是在统计学中,“似然性”和“或然性”或“概率”又有明确的区分。概率用于在已知一些参数的情况下,预测接下来的观测所得到的结果,而似然性则是用于在已知某些观测所得到的结果时,对有关事物的性质的参数进行估计。
在这种意义上,似然函数可以理解为条件概率的逆反。在已知某个参数B时,事件A会发生的概率写作:
利用贝叶斯定理,
因此,我们可以反过来构造表示似然性的方法:已知有事件A发生,运用似然函数
注意到这里并不要求似然函数满足归一性:
例子
考虑投掷一枚硬币的实验。通常来说,已知投出的硬币正面朝上和反面朝上的概率各自是
其中H表示正面朝上。
在统计学中,我们关心的是在已知一系列投掷的结果时,关于硬币投掷时正面朝上的可能性的信息。
我们可以建立一个统计模型:假设硬币投出时会有
这时,条件概率可以改写成似然函数:
也就是说,对于取定的似然函数,在观测到两次投掷都是正面朝上时,
如果考虑
三次投掷中头两次正面朝上,第三次反面朝上时的似然函数
注意到似然函数的值变大了。
这说明,如果参数
在这个例子中,似然函数实际上等于:
如果取
类似地,如果观测到的是三次投掷硬币,头两次正面朝上,第三次反面朝上,那么似然函数将会是:
这时候,似然函数的最大值将会在
最大似然估计
我们首先要定义似然函数:
并且在
例子
现在假设例子1中的盒子中有无数个硬币,对于
其中
在不同比例参数值下一个二项式过程的可能性曲线t = 3, n = 10;其最大似然估计值发生在其众数并在曲线的最大值处。
其解为
这个结果很容易一般化。只需要用一个字母
对于任何成功次数为
基本上就是似然函数就是一件事发生的概率公式,而最大似然估计是在当前似然函数下函数能取到的最大值,就是一件事最可能发生的概率,这在计算中很重要。
在一个垃圾邮件检测代码中贝叶斯公式的解释
这里有个优化就是对词的初始出现次数默认置1,防止分子为0导致整个值为0,还有所有词数如果为0的话默认置2,防止除0错误
另一个是为了优化多个0.1左右的值乘积会变得很小,所以用ln(a∗b)=ln(a)+ln(b) 这个公式可以把乘积变成先ln然后求和
看一个机器学习实战中贝叶斯检测垃圾词的代码
from numpy import *def loadDataSet(): postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] classVec = [0,1,0,1,0,1] #1 is abusive, 0 not return postingList,classVecdef createVocabList(dataSet): vocabSet = set([]) #create empty set for document in dataSet: vocabSet = vocabSet | set(document) #union of the two sets return list(vocabSet)def setOfWords2Vec(vocabList, inputSet): returnVec = [0]*len(vocabList) for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] = 1 else: print "the word: %s is not in my Vocabulary!" % word return returnVecdef trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) p0Num = ones(numWords); p1Num = ones(numWords) #change to ones() p0Denom = 2.0; p1Denom = 2.0 #change to 2.0 for i in range(numTrainDocs): if trainCategory[i] == 1: p1Num += trainMatrix[i] p1Denom += sum(trainMatrix[i]) else: p0Num += trainMatrix[i] p0Denom += sum(trainMatrix[i]) p1Vect = log(p1Num/p1Denom) #change to log() p0Vect = log(p0Num/p0Denom) #change to log() return p0Vect,p1Vect,pAbusivedef classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) if p1 > p0: return 1 else: return 0def testingNB(): listOPosts,listClasses = loadDataSet() myVocabList = createVocabList(listOPosts) trainMat=[] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocabList, postinDoc)) p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses)) testEntry = ['love', 'my', 'dalmation'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) print "p0v: ", p0V, " p1V : ", p1V, " pAb: ", pAb print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb) testEntry = ['stupid', 'garbage'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)if __name__ == '__main__': listOposts, listClasses = loadDataSet() myVocabList = createVocabList(listOposts) print setOfWords2Vec(myVocabList, listOposts[0]) print testingNB()
- 机器学习基础--贝叶斯分类器
- 0基础讲解机器学习算法-朴素贝叶斯分类器
- 机器学习基础-Knn分类器
- 机器学习--贝叶斯分类器
- 机器学习-贝叶斯分类器
- 机器学习基础决策树分类
- 机器学习-贝叶斯分类
- 机器学习-贝叶斯分类
- 机器学习 贝叶斯分类
- 基础的机器学习实例,朴素贝叶斯分类
- 【机器学习】贝叶斯分类器:朴素贝叶斯
- 【机器学习】贝叶斯分类器:贝叶斯网络
- 机器学习-朴素贝叶斯分类器
- 复习机器学习算法:贝叶斯分类器
- 机器学习 之 贝叶斯分类器
- 机器学习系列----朴素贝叶斯分类器
- 【机器学习】朴素贝叶斯分类器
- 机器学习之三:贝叶斯分类器
- 【AppScan深入浅出】修复漏洞:会话标识未更新(中危)
- Saltstack安装和使用
- 盒子居总结(display:block)
- 吾日三省
- 微信小程序图片链接加入正常,控制台报404错误解决方案
- 机器学习基础--贝叶斯分类器
- 剑指Offer—64—滑动窗口的最大值
- UVA
- [ERROR] WSREP: gcs/src/gcs_group.cpp:gcs_group_handle_join_msg():765: Will never receive state. Need
- Keras中的神经网络层组件简介
- Ansible安装和使用
- 基于SSM 的 Office 在线编辑
- c++树状数组2模板
- 剑指Offer—65—矩阵中的路径