本文为学习《统计学习方法》、《机器学习实战》朴素贝叶斯相关的笔记。
朴素贝叶斯,是基于贝叶斯定理和特征条件独立假设的分类方法。
特征条件独立假设是指:给定一个实例的类标签,实例中的每个属性的出现都独立于实例中其他属性的出现。这也是算法被称为朴素贝叶斯的原因。
公式推导
我们有数据集

先验概率:

条件概率:


对条件概率分布作条件独立性的假设,即特征之间不相关,可以得出

在分类时,对于给定的


将 上上式代入上式,可得

一个例子
这个例子来自于《机器学习实战》,是根据词条中词汇的出现判断其是否是侮辱性词条。
我们构造以下数据:
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代表侮辱性
return postingList,classVec
在计算先验概率和条件概率之前我们需要将输入向量统一化,即对于每个词条进行处理,将其用具有相同的特征数量的特征向量来表示。以下第一个函数创建一个词汇列表 vocablist,包含所有词条中所有词汇;第二个函数创建一个长度为词汇列表长度的向量,对于词条中的每个词汇,若出现在词汇列表中,则将向量中对应位置置为1。相当于我们的输入向量
#创建词汇列表
def createVocabList(dataSet):
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document)
return list(vocabSet)
#将词条转换为输入向量
def setOfWords2Vect(vocabList,inputSet):
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in inputSet:
returnVec[vocabList.index(word)] = 1
else:
print('This word:',word,' is not in my Vocalbulary')
return returnVec
接着计算先验概率和条件概率:
def trainNB0(trainMatrix,trainCategory):
numDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
#在所有样本中是某种类别的概率
pAbusive = sum(trainCategory)/float(numWords)
p0Num = np.ones(numWords)
p1Num = np.ones(numWords)
p0Sum = 2; p1Sum = 2
for i in range(numDocs):
if(trainCategory[i]==1):
p1Num += trainMatrix[i]
p1Sum += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Sum += sum(trainMatrix[i])
p0Vect = np.log(p0Num/p0Sum)
p1Vect = np.log(p1Num/p1Sum)
return p0Vect,p1Vect,pAbusive
以上pAbusive相当于我们的


条件概率


p0Vect,p1Vect均为长为 len(vocablist) 的向量,分别表示类别为非侮辱性和侮辱性时词条向量中各词汇的出现概率。
最后对给定的向量
def classifyNB(vec2classify,p0V,p1V,pClass1):
p1 = np.sum(vec2classify*p1V)+np.log(pClass1)
p0 = np.sum(vec2classify*p0V)+np.log(1-pClass1)
if p1>p0:
return 1
else:
return 0
至此,用朴素贝叶斯进行简单的判断词条是否是侮辱性词条的例子结束。
来源:CSDN
作者:jxc_
链接:https://blog.csdn.net/weixin_42761645/article/details/103593487