一、朴素贝叶斯算法介绍

朴素贝叶斯,之所以称为朴素,是因为其中引入了几个假设。而正因为这几个假设的引入,使得模型简单易理解,同时如果训练得当,往往能收获不错的分类效果,因此这个系列以naive bayes开头和大家见面。


因为朴素贝叶斯是贝叶斯决策理论的一部分,所以我们先快速了解一下贝叶斯决策理论。

举例:

    假设有一个数据集,由两类组成(简化问题),对于每个样本的分类,我们都已经知晓。数据分布如下图(图取自MLiA):

 

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_朴素贝叶斯

,其分类未知。我们可以用p1(x,y)表示数据点(x,y)属于红色一类的概率,同时也可以用p2(x,y)表示数据点(x,y)属于蓝色一类的概率。那要把new_point归在红、蓝哪一类呢?

    我们提出这样的规则:

p1(x,y) > p2(x,y),则(x,y)为红色一类。

p1(x,y) <p2(x,y),  则(x,y)为蓝色一类。

    换人类的语言来描述这一规则:选择概率高的一类作为新点的分类。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

    用条件概率的方式定义这一贝叶斯分类准则:

       p(red|x,y) > p(blue|x,y), 则(x,y)属于红色一类。

p(red|x,y) < p(blue|x,y), 则(x,y)属于蓝色一类。

    也就是说,在出现一个需要分类的新点时,我们只需要计算这个点的

类2 | x,y),p(类3 | x,y)...p(类n| x,y))。其对于的最大概率标签,就是这个新点的分类啦。


i 如何求解p(类i| x,y)?没错,就是贝叶斯公式:

    

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_朴素贝叶斯算法进行新闻分类java实现_02

    公式暂不推导,先描述这个转换的重要性。红色、蓝色分类是为了帮助理解,这里要换成多维度说法了,也就是第二部分的实例:判断一条微信朋友圈是不是广告。

实例:   

    前置条件是:

    我们已经拥有了一个平日广大用户的朋友圈内容库,这些朋友圈当中,如果真的是在做广告的,会被“热心网友”打上“广告”的标签,我们要做的是把所有内容分成一个一个词,每个词对应一个维度,构建一个高维度空间

    当出现一条新的朋友圈new_post,我们也将其分词,然后投放到朋友圈词库空间里。

X表示多个特征(词)a1,a2,a3...组成的特征向量。

表示:已知朋友圈内容而这条朋友圈是广告的概率。

    利用贝叶斯公式,进行转换:

        P(ad|X) = p(X|ad) p(ad) / p(X)

        P(not-ad | X) = p(X|not-ad)p(not-ad) / p(X)

    比较上面两个概率的大小,如果p(ad|X) > p(not-ad|X),则这条朋友圈被划分为广告,反之则不是广告。

 

    看到这儿,实际问题已经转为数学公式了。

    朴素贝叶斯分类的正式定义如下:

      1、设

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_朴素贝叶斯_03

为一个待分类项,而每个a为x的一个特征属性。、有类别集合

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_条件概率_04

。、计算

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_条件概率_05

。、如果

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_贝叶斯决策_06

,则 

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_条件概率_07


      那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

      1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

、统计得到在各类别下各个特征属性的条件概率估计。即。

、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

              

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_贝叶斯决策_08

      因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

              

朴素贝叶斯算法进行新闻分类java实现 朴素贝叶斯应用实例_条件概率_09

     这里要引入朴素贝叶斯假设了。如果认为每个词都是独立的特征,那么朋友圈内容向量可以展开为分词(x1,x2,x3...xn),因此有了下面的公式推导:

      P(ad|X) = p(X|ad)p(ad) = p(x1, x2, x3, x4...xn | ad) p(ad)

    假设所有词相互条件独立,则进一步拆分:

      P(ad|X) = p(x1|ad)p(x2|ad)p(x3|ad)...p(xn|ad) p(ad)

(╯▽╰)╭,不过这也是朴素贝叶斯的朴素所在,简单的看待问题。

    看公式p(ad|X)=p(x1|ad)p(x2|ad)p(x3|ad)...p(xn|ad)p(ad)

P(xi|ad)很容易求解,P(ad)为词库中广告朋友圈占所有朋友圈(训练集)的概率。我们的问题也就迎刃而解了。


个人理解,不知道对不对:

p(ad|X):      

       p(ad|X)=p(x1|ad)p(x2|ad)p(x3|ad)...p(xn|ad)p(ad)

       其中p(x1|ad)可以理解为特征的第一维在样本X属于类ad上的贡献(权重)


为确保掌握朴素贝叶斯分类原理,做一个例子,垃圾语句分类:

'love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth',其中类C=0的3个,类C=1的5个。

P(F1=1|C=0)=1/5   P(F2=1|C=0) =2/5  ............

    现在,假设给你一个测试样本"nb movie",使用加一平滑进行朴素贝叶斯的分类过程如下:

    P(C=0)=3/8, P(C=1)=5/8。特征F1="nb", F2="movie",F3="love",.....................

    分为C=0的概率:P(C=0 | F1=1, F2=1) = P(C=0)*P(F1=1|C=0)*P(F2=1|C=0) = 3/8 * (0+1)/(3+2) * (1+1)/(3+2) = 3/8 * 1/5 * 2/5 = 0.03。其中没有出现的特征的条件概率P(F3=1|C=0)等是没有用的!

    分为C=1的概率:P(C=1 |F1=1, F2=1) = P(C=1)*P(F1=1|C=1)*P(F2=1|C=1) = 5/8 * (3+1)/(5+2) * (3+1)/(5+2) = 5/8 * 4/7 * 4/7 = 0.20。

    分为C=1的概率更大。因此将该样本分为C=1类。


    有时候取log计算最后的概率,取log后,就是P(C=0)+P(F1=1|C=0)+P(F2=1|C=0),这样可以防止一些小于1的小数相乘,结果太小。