机器学习(2)朴素贝叶斯Naive Bayesian 应用举例

一、朴素贝叶斯算法介绍

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


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

举例:

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

 

    现在出现一个新的点new_point (x,y),其分类未知。我们可以用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)属于蓝色一类。

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

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


    那么问题来了,对于分类如何求解p(类i| x,y)没错,就是贝叶斯公式:

    

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


实例:   

    前置条件是:

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

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

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

    P(ad|X)表示:已知朋友圈内容而这条朋友圈是广告的概率。

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

        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、设为一个待分类项,而每个ax的一个特征属性。

      2、有类别集合

      3、计算

      4、如果,则 

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

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

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

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

              

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

              

     这里要引入朴素贝叶斯假设了。如果认为每个词都是独立的特征,那么朋友圈内容向量可以展开为分词(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)为词库中广告朋友圈占所有朋友圈(训练集)的概率。我们的问题也就迎刃而解了。


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

  欲求样本X属于类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上的贡献(权重)


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

    训练集中共8个样本,特征有'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的小数相乘,结果太小。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值