朴素贝叶斯
优点:在数据较少的情况下仍然有效,可以出来多类别问题。
缺点:对于输入数据的准备方式较为敏感。
适用数据类型:标称型数据
贝叶斯
贝叶斯概率引入先验知识和逻辑推理来处理不确定命题。另一种概率解释称为频数,它只从数据本身获得结论,并不考虑逻辑推理及先验知识。
条件概率
p(c|x) = p(x|c)p(c)/p(x)
朴素贝叶斯的一般过程:
1.收集数据:可以使用任何方法。
2.准备数据:需要数值型或者布尔型数据
3.分析数据:有大量特征是,汇总特征作用不大,此时使用直方图效果更好。
4.训练算法:计算不同的独立特征的条件概率
5.测试算法:计算错误率
6.使用算法:一个常见的朴素贝叶斯应用是文档分类。可以是任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本
特征相互独立
指的是统计意义上的独立,即一个特征或者单词出现的可能性与它和其他单词相邻没有任何关系。
朴素贝叶斯实现方式
1.基于贝努力模型实现
2.基于多项式模型实现
使用Python进行文本分类
伪代码:
计算每个类别中的文档数目
对每篇训练文档:
对每个类别:
如果词条出现在文档中→增加该词条的计数值
增加所有词条的计数值
对每个类别:
对每个词条:
将该词条的数目除以总词条数目得到条件概率
返回每个类别的条件概率
bayes.py
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,classVec
def createVacab(Data):
Vaca = set([])
for document in Data:
Vaca = Vaca | set(document)
return list(Vaca)
def wordOf2V(Data,Vaca):
returnV = [0]*len(Vaca)
for word in Data:
if word in Vaca:
returnV[Vaca.index(word)] = 1
else:
print(word," is not in Vocab")
return returnV
def trainNB0(Mat,classVec):
docNum = len(Mat)
docl = len(Mat[0])
pAB = sum(classVec) / docNum
p0num = ones(docl)
p1num = ones(docl)
p0demo = 0
p1demo = 0
for i in range(docNum):
if classVec[i] == 1:
p1num +=Mat[i]
p1demo +=sum(Mat[i])
else:
p0num +=Mat[i]
p0demo +=sum(Mat[i])
return p0num/p0demo,p1num/p1demo,pAB
def classfifNB(dataMat,p0V,p1V,pAB):
p1 = sum(dataMat*p1V) + log(pAB)
p0 = sum(dataMat*p0V) + log(1.0-pAB)
if p1>p0:
return 1
else:
return 0
postingList,classVec = loadDataSet()
Vocab = createVacab(postingList)
Mat = []
for i in postingList:
Mat.append(wordOf2V(i,Vocab))
p0V,p1V,pAB = trainNB0(Mat,classVec)
test = ['I','love','you']
vtest = wordOf2V(test,Vocab)
print(classfifNB(vtest,p0V,p1V,pAB))
test = ['stupid','garbage']
vtest=wordOf2V(test,Vocab)
print(classfifNB(vtest,p0V,p1V,pAB))
可能会存在下溢问题,由于太多很小的数相乘造成的。一种解决办法是对乘积取自然对数
朴素贝叶斯词袋模型
我们将每个词的出现与否作为一个特征,这可以被描述为词集模型。如果一个词在文档中出现不止一次,这可能意味着包含该词是否出现在文档中所不能表达的某种信息。
def bagOfWords2VecMN(vocablist,inputset):
returnVec = [0]*len(vocablist)
for word in inputset:
if word in vocablist:
returnVec[vocablist.index(word)] += 1
return returnVec