朴素贝叶斯法(naive Bayes)

      本文简单介绍一下如何用朴素贝叶斯算法进行分类,和之前一样,先从一个问题开始,逐步解决,文中会尽量简化一些数学描述,较多的是结合给出的例子直接描述问题,仅在最后给出一般化的公式。文中描述仅是个人见解,难免有些错误和不足的地方,还请大家见谅。

      GitHub项目(Python):从指定训练数据中生成朴素贝叶斯分类器并对数据进行预测

一、问题描述

      对于分类问题,假设现在有如下训练数据:

 

表1
 123456789101112
X1112223213133
X2bcaabccacbbc
Y001111001011

      表1中一共有12组数据,Y是分类标签(分别为0类和1类),X1、X2为特征属性(假设为离散属性),其中X1的可能取值为:1、2、3,X2的可能取值为:a、b、c。

      现在给定一个待测样本K,K的特征属性X1、X2的取值分别为:3、a。现在的问题是:K应该属于哪一类?(Y=0?or Y=1?)

二、条件概率

      对于上述问题,如果从概率的角度思考,可以转化为这样一个问题:对于待测样本K(X1=3;X2=a),分别求K属于0类的概率P(Y=0)和K属于1类的概率P(Y=1),如果P(Y=0)>P(Y=1),则K应该属于0类;否则K应该属于1类。

     用数学描述就是:在已知X1=3、X2=a的条件下,求Y=0发生的概率和Y=1发生的概率,即条件概率P(Y=0|X1=3;X2=a)、P(Y=1|X1=3;X2=a)。

      对于条件概率,有如下定义:在事件A发生的条件下,事件B发生的概率记为条件概率P(B|A),设实验基本事件总数为n,A所包含的基本事件数为m(m>0),AB所包含的基本事件数为k,则有P(B|A)=k/m=(k/n)/(m/n)=P(AB)/P(A)。直观上来说,就是事件A、B同时发生的概率除以事件A发生的概率,即为事件A发生条件下,事件B发生的概率。

    对于第一节给出的问题,这里可以简化一下,记Y的取值为事件B,X的取值为事件A。要求得P(Y=0|X1=3;X2=a)、P(Y=1|X1=3;X2=a),即P(B|A),需要从样本中求得P(AB)和P(A),可以看到对于A事件,即X1=3;X2=a,无论Y=1还是Y=0,P(A)都是一样的,所以,这里只需要求P(AB),即P(Y=0;X1=3;X2=a)、P(Y=1;X1=3;X2=a),然后比较其大小。

     要从样本中求P(AB),需要用到极大似然估计的思想(即待求的参数应当使得样本集合中尽可能多的样本满足估计),但是对于本例中,样本中并不含有任何(Y=0;X1=3;X2=a)、(Y=1;X1=3;X2=a)的样例,这是不直接求P(AB)的原因之一,另一个主要原因就是,P(AB)的概率即使不为0,一般也很低,这样的话就只使用了样本集合中很少一部分的样本来估计P(AB)的值,这并不符合极大似然估计的思想。

     注:关于极大似然估计,一个典型的应用就是Logistic回归

三、朴素贝叶斯法

     对于条件概率P(B|A),有P(B|A)=P(AB)/P(A),那么对于条件概率P(A|B),同样有P(A|B)=P(BA)/P(B),显然P(AB)=P(BA),所以可以得到P(B|A)=P(A|B)*P(B)/P(A)。同样,对于第一节的问题,P(A)都是一样的,所以只需要求P(A|B)*P(B)。

     这里P(B),即P(Y=1)和P(Y=0),很好求,分别为7/12和5/12。

     P(A|B),即P(X1=3;X2=a|Y=1)和P(X1=3;X2=a|Y=0)。先考虑P(X1=3;X2=a|Y=1),朴素贝叶斯法假设各个条件之间相互独立,互不影响,朴素贝叶斯法也是由这个假设得名。具体来说,就是X1与X2之间是相互独立的,那么P(X1=3;X2=a|Y=1)就可以写成P(X1=3|Y=1)*P(X2=a|Y=1)。

     根据样本集合,即表1,可以求得以下极大似然估计值:

     P(X1=3|Y=1) = 3/7 , P(X2=a|Y=1) = 2/7 ; 则P(X1=3;X2=a|Y=1) = 3/7 * 2/7 = 6/49

     P(X1=3|Y=0) = 0/5 , P(X2=a|Y=0) = 1/5 ; 则P(X1=3;X2=a|Y=0) = 0/5 * 1/5 = 0

     可以发现其中有一项为0,则该项乘积全部为0,这大大影响了估计的准确率。解决方法是:对于P(X1=3|Y=0),设X1的可能取值为S个(这里为1、2、3,即S=3),样本集合中满足X1=3且Y=0的样本数为n(这里n=0),满足Y=0的样本数为m(这里m=5),原P(X1=3|Y=0)的估计值为n/m,由于n=0,导致整体为0。现在,修改P(X1=3|Y=0) = (n+h)/(m+S*h),其中h>=0。可以看出,修改后P(X1=1|Y=0) + P(X1=2|Y=0) + P(X1=3|Y=0)的值为(4+h)/(5+3*h) + (1+h)/(5+3*h) + (0+h)/(5+3*h) = [(4+1+0) + (h+h+h)]/(5+3*h) = 1 , 即修改后的P(X1|Y=0)仍然为一种概率分布。相对于极大似然估计值n/m,这里的(n+h)/(m+S*h),称为贝叶斯估计,当其取0时,即为极大似然估计,常取1,这时称为拉普拉斯平滑。对于这种修改,取适当的h,可以保证每一项的值都不取到0。   

四、问题求解

     根据以上的方法,我们可以对第一节的问题进行求解了:

     P(Y=0|X1=3;X2=a)  =  P(X1=3;X2=a|Y=0)*P(Y=0)/P(X1=3;X2=a)  

                               ~=  P(Y=0)*P(X1=3|Y=0)*P(X2=a|Y=0) 

                                =  5/12 * (0+1)/(5+3) * (1+1)/(5+3) 

                                =  0.013

     P(Y=1|X1=3;X2=a)  =  P(X1=3;X2=a|Y=1)*P(Y=1)/P(X1=3;X2=a)  

                               ~=  P(Y=1)*P(X1=3|Y=1)*P(X2=a|Y=1) 

                                =  7/12 * (3+1)/(7+3) * (2+1)/(7+3) 

                                =  0.07

     因为P(Y=1|X1=3;X2=a) > P(Y=0|X1=3;X2=a) , 所以可以认为待测样本K(X1=3;X2=a)应该属于1类。

    根据以上描述,可以看出,对于给定待测样本X(x1;x2;x3...xn),使用朴素贝叶斯法分类,就是求。其中,

     P(c)代表样本集合中c类样本的概率,即P(c) = D(c)/D,(D(c)为c类样本的数量,D为总样本数量);

     代表c类样本中,第i个属性为的概率,,(代表c类样本中第i个属性为的样本数量,代表第i个属性的可能取值数量,D(c)代表c类样本的数量)。

     当取到最大值时,此时c的取值就是待测样本的分类。

五、连续属性

     对于有些属性,其取值可能不是一个离散值,而是一个连续值,比如:密度 = 0.6。

     对于连续值,可以考虑概率密度函数,假定(一般来说,如果一个量是由多个微小的独立随机因素影响的结果,那么就可以认为这个量具有正态分布,参考中心极限定理),其中分别为第c类样本在第i个属性上取值的均值和方差,则有:

     

      至此,朴素贝叶斯法的基本流程已经介绍完毕,但是在实际编程中,由于每个概率P均小于1,连续多次相乘后(例如100个0.6相乘),可能导致计算溢出,常用的解决方法是利用对数的性质log(A*B) = logA + logB , 对待计算的概率取对数,将乘法问题转化为加法,方便计算。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值