本文为学习《统计学习方法》、《机器学习实战》朴素贝叶斯相关的笔记。
朴素贝叶斯,是基于贝叶斯定理和特征条件独立假设的分类方法。
特征条件独立假设是指:给定一个实例的类标签,实例中的每个属性的出现都独立于实例中其他属性的出现。这也是算法被称为朴素贝叶斯的原因。
公式推导
我们有数据集
,其中输入为特征向量 ,输出为类标记 。朴素贝叶斯要通过数据集学习先验概率和条件概率。先验概率:
这里代表数据集中的每个类别的概率条件概率:
这里代表在类别为 时,输入的特征向量中的每一个特征值为对应的 的概率。对条件概率分布作条件独立性的假设,即特征之间不相关,可以得出
在分类时,对于给定的
,通过学习到的模型计算得到后验概率 ,将后验概率最大的类作为 的类输出。后验概率计算根据贝叶斯定理进行 :将 上上式代入上式,可得
,代表在后验概率最大时对应的 值。一个例子
这个例子来自于《机器学习实战》,是根据词条中词汇的出现判断其是否是侮辱性词条。
我们构造以下数据:
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。相当于我们的输入向量
为一个有len(vocablist)个特征的向量,每个特征可取 0 和 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相当于我们的
,而 = 1-pAbusice。至此得出先验概率。条件概率
= p1Vect , = p0Vect。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