这个符号代表的意思是在类别Ci的条件下,出现某个由x,y组成的数据点的概率。
这个准则的目的是求当知道某个点的条件下,判断他属于哪个类别的条件概率。
假设数据点(x,y)可能分成C1,C2类,使用上述的贝叶斯公式进行类别的判断。那么定义贝叶斯准则为:
如果P(C1|x,y)>P(C2|x,y),那么该点属于类别C1
如果P(C1|x,y)
即假设每个样本中的特征出现的可能性相互独立。那么对于多特征的问题计算条件概率的时候,可以利用以下公式来计算条件概率:
P(x,y,z|C1)=P(x|C1)* P(y|C1) * P(z|C1)
这里w代表一个词向量,这个词向量有多个特征(w0,w1,w2,…wn),ci是这个词向量的分类。这里假设所有的特征词汇都是独立的,那么在计算p(w0,w1,w2…wn|ci)就可以用p(w0|ci) * p(w1|ci)…p(wn|ci)来代替,这就是朴素贝叶斯的原理。
测试词条转化成向量:
转化出来的向量每个元素代表词汇表中的单词是否出现在该词条中,若出现,则对应元素为1,否则,对应元素为0
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 returnVec
训练贝叶斯分类器:
这里注意了,每个词汇表都相当于一个贝叶斯模型,不同的词汇表会输入不同的trainMatrix,trainCategory参数,从而在训练的结果会出现不同的p0Vect,p1Vect,pAbusive。
#train
def trainNB0(trainMatrix,trainCategory):
numTrainDocs=len(trainMatrix)
numWords=len(trainMatrix[0])
pAbusive=sum(trainCategory)/float(numTrainDocs)#计算出该文档中出现侮辱性词汇的先验概率
p0Num=ones(numWords)
p1Num=ones(numWords)
p0Denom=2.0
p1Denom=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)
p0Vect=log(p0Num/p0Denom)
return p0Vect,p1Vect,pAbusive
测试分类器:
在classifyNB()函数中,以p(ci,w)代替p(ci|w)来最终判断w的类别,可能是因为在这个分词的背景下,这两个概率是等价的(这个仅仅是我个人的理解)
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
##以下加号的左边是将所有的log相加,就是将所有出现在测试词条的属性的条件概率相乘,最后得出总体的条件概率,右边是类别取对数
p1=sum(vec2Classify*p1Vec)+log(pClass1)
p0=sum(vec2Classify*p0Vec)+log(1-pClass1)
if p1 > p0:
return 1
else:
return 0
#这里太简单,不做解释
def testingNB():
lsitOPosts,listClasses=loadDataSet()
myVocabList=createVocabList(listOPosts)
trainMat=[]
for postinDoc in listOPosts:
trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
p0V,p1V,pAb=trainNB0(trainMat,listClasses)
testEntry=['love','my','dalmation']
thisDoc=setOfWords2Vec(myVocabList,testEntry)
print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
testEntry=['stupid','garbage']
thisDoc=setOfWords2Vec(myVocabList,testEntry)
print testEntry,'Classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
就是将一个数据集一部分作为训练集,一部分作为测试集合。训练集和测试集不能有交集。
7.以上的一些注释都是对《机器学习实践》一书中第4章贝叶斯算法的一些比较难懂的地方的一下个人理解。