朴素贝叶斯是贝叶斯系列算法中应用最广的方法,贝叶斯方法最早由应该统计学家Thomas Bayes提出,其实简单的理解的话就是根据已经发生的某些情况来确定某事件发生的概率,而朴素贝叶斯的“朴素”指的是假设样本的所有特征都独立。核心公式理解简单了就是条件概率公式:
P(A|B)=P(B|A)*PA/P(B)=P(AB)/P(B)
由于前面已经写过朴素贝叶斯(https://blog.csdn.net/cxjoker/article/details/78472376)、半朴素贝叶斯(https://blog.csdn.net/cxjoker/article/details/81878037)和贝叶斯网络(https://blog.csdn.net/cxjoker/article/details/81878188)了,所以就不细讲述,有兴趣的可以去看。所以这一节直接从《机器学习实战》的4.5节开始吧。
使用python进行文本分类
数据准备阶段比较简单,其实就是用了自然语言处理上面的One-Hot方法,就是先建立一个词集(createvocablist)包含所有在现有的文本中出现的单词,如果有新的句子加入,就将该句话中出现的新词加入到词袋中。然后对一句话生成它的词向量(bagofwords2vecmn),即当该句话中出现过某个词时,向量上就取1,为出现就是0,向量和词集一样长。这是自然语言处理常用的方法,但是同时也会出现该句话的向量过于稀疏的情况。
训练函数:
主要用到了朴素贝叶斯公式,根据特征独立假设(即所有词之间是独立的),直接计算p(w0|ci)p(w1|ci)p(w2|ci)…p(wN|ci),然后获得p(ci|w),比较哪个类别的概率大,然后直接将类别概率大的作为分类结果。
代码思想:
- 计算每个类别中的文档数目
- 对每篇文档:
对每个类别:
如果词条出现在文档中:增加该词条的计数值
增加所有词条的计数值 - 列表内容
对每个类别:
对每个词条:
将该词条的数目初一总词条数目得到条件概率 返回每个类别的条件概率
具体代码如下:
def loaddataset():
postinglist=[['my','dog','has','flae','problem','help','plaese'],
['maybe','not','take','him','to','dog','park','stupid'],
['my','dog','is','so','cute','i','love','him'],
['stop','posting','stupid','worthless','garbage',],
['mr','licks','ate','my','steak','how','to','stop','him'],
['qiut','buying','worthless','dog','food','stupid']]
classvec=[0,1,0,1,0,1]
return postinglist,classvec
def createvocablist(dataset):#功能是创建一个不重复的词汇表
vocabset=set([])#创建出来的是一个集合,
for document in dataset:
vocabset =vocabset | set(document)#set(document)不重复的提取出所有的词,并且加入到vocabset集里面去
return list(vocabset)
def bagofwords2vecmn(vocablist,inputset):#生成分类向量,当所输入的文章中的词在vocablist中出现时,就将其对应的向量设置为1,否则维持原来的不变
returnvec=[0]*len(vocablist)
for word in inputset:
if word in vocablist:
returnvec[vocablist.index(word)] +=1
return returnvec
def trainnbo(trainmatrix,traincategory):#输入训练样本和属性(分类)标记
numtraindocs=len(trainmatrix)#计算训练样本的样本数
numwords=len(trainmatrix[0])#
pabusive=sum(traincategory)/float(numtraindocs)#计算p(c)的概率(比重)这里面指的是分类为1的比重,因为求和之后为0的不考虑
p0num=np.ones(numwords);p1num=np.ones(numwords)
p0denom=2.0;p1denom=2.0
for i in range(numtraindocs):
if traincategory[i]==1:
p1num +=trainmatrix[i]#如果说归为1类,那么把这个训练样本的向量和原先已有的向量加和,保证了同一位置(表示同一单词)的数量的叠加,起到计数的作用
p1denom +=sum(trainmatrix[i])
else:
p0num +=trainmatrix[i]
p0denom +=su