朴素贝叶斯(Naive Bayes)是基于贝叶斯定理与特征条件假设的分类方法。
对于给定的训练数据集,首先基于特征条件独立假设学习输入、输出的联合分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
朴素贝叶斯实现简单,学习与预测的效率都很高,是一种常用的方法。
一、朴素贝叶斯的学习与分类
1.1贝叶斯定理
先看什么是条件概率
P(A|B表示事件B已经发生的前提下,事件A发生的概率,叫做事件B
发生下事件A的条件概率。其基本求解公式为
贝叶斯定理便是基于条件概率,通过P(A|B)来求P(B|A):
P(B|A)=P(A|B)·P(B)P(A)顺便提一下,上式中的分母,可以根据全概率公式分解为:
P(A)=n∑i=1P(Bi)P(A|Bi)1.2 特征条件独立假设
这一部分开始朴素贝叶斯的理论推导,从中你会深刻地理解什么是特征条件独立假设。
给定训练数据集(X,Y),其中每个样本X都包括n维特征,即x=(x1,x2,···,xn),类标记集合含有K种类别,即y=(y1,y2,···,yk)
如果现在来了一个新样本x我们要怎么判断它的类别?从概率的角度来看,这个问题就是给定x,它属于哪个类别的概率更大。那么问题就转化为求解P(y1|x),P(y2|x),P(yk|x)中最大的那个,即求后验概率最大的输出:argmaxykP(yk|x)
那P(yk|x)怎么求解?答案就是贝叶斯定理:
P(yk|x)=P(x|yk)·P(yk)P(x)根据全概率公式,可以进一步分解上式中的分母:
P(yk|x)=P(x|yk)·P(yk)∑ni=1P(x|yk)P(yk)(公式1)先不管分母,分子中的P(yk)是先验概率,根据训练集就可以简单地计算出来,而条件概率P(x|yk)=P(x1,x2,···,xn|yk),它的参数规模是指数数量级别的,假设第i维特征xi可取值的个数有Si个,类别取值个数为k个,那么参数个数为k∏nj=1Sj
这显然是不可行的。针对这个问题,朴素贝叶斯算法对条件概率分布做了独立性的假设,通俗地讲就是说假设各个维度的特征x1,x2,···,xn互相独立,由于这是一个较强的假设,朴素贝叶斯算法也因此得名。在这个假设的前提上,条件概率可以转化为:
P(x|yi)=P(x1,x2,···,xn|yi)=n∏i=1P(xi|yi)(公式2)这样参数规模就降到了∑ni=1Sik
以上就是针对条件概率所作出的特征条件独立性假设,至此,先验概率P(yk)和条件概率P(x|yk)的求解问题就都解决了,那么我们是不是可以求解我们所需要的后验概率P(yk|x)了
答案是肯定的。我们继续上面关于P(yk|x)的推导,将公式2代入公式1中得到:
P(yk|x)=P(yk)∏ni=1P(xi|yk)∑kP(yk)∏ni=1P(xi|yk)于是朴素贝叶斯分类器可表示为:
f(x)=argmaxykP(yk|x)=argmaxykP(yk)∏ni=1P(xi|yk)∑kP(yk)∏ni=1P(xi|yk)因为对于所有的yk,上式中的分母的值都是一样的(为什么?注意到全加符号就容易理解了),所以可以忽略分母部分,朴素贝叶斯分裂期最终表示为:
f(x)=argmaxykP(yk)n∏i=1P(xi|yk)二、朴素贝叶斯法的参数估计
2.1 极大似然估计
根据上述,可知朴素贝叶斯要学习的东西就是P(Y=ck)和P(Xj=ajl|Y=ck),可以应用极大似然估计法估计相应的概率(简单讲,就是用样本来推断模型的参数,或者说是使得似然函数最大的参数)。
先验概率P(Y=ck)的极大似然估计是
P(Y=ck)=∑Ni=1I(yi=ck)N,k=1,2,···,K也就是用样本中ck的出现次数除以样本容量。
推导如下:
设第j个特征x(j)可能取值的集合为aj1,aj2,···,ajl,条件概率P(Xj=ajl|Y=ck)的极大似然估计是:
P(X(j)=ajl|Y=ck)=∑Ni=1I(x(j)i=ajl,yi=ck)∑Ni=1I(yi=ck)式中,xji是第i个样本的第j个特征。
2.2 贝叶斯估计
极大似然估计有一个隐患,假设训练数据中没有出现某种参数与类别的组合怎么办?比如上例中当Y=1对应的X(1)的取值只有1和2。这样可能会出现所要估计的概率值为0的情况,但是这不代表真实数据中就没有这样的组合。这时会影响到后验概率的计算结果,使分类产生偏差。解决办法是贝叶斯估计。
条件概率的贝叶斯估计:
Pλ(X(j)=ajl∥Y=ck)=∑Ni=1I(x(j)i=ajl,yi=ck)+λ∑Ni=1I(yi=ck)+Sjλ其中λ≥0,Sj表示xj可能取值的中数。分子和分母分别比极大似然估计多了一点东西,其意义为在随机变量各个取值的频数上赋予一个正数λ≥0。当λ=0时就是极大似然估计。常取λ=1,这时称为拉普拉斯平滑。
先验概率的贝叶斯估计:
Pλ(Y=ck)=∑Ni=1I(yi=ck)+λN+Kλ例题如下:
三、python代码实现
3.1 朴素贝叶斯文档分类
|
|
3.2 使用朴素贝叶斯过滤垃圾邮件
|
|
四、参考资料
维基百科:Naive Bayes classifier
数学之美番外篇:平凡而又神奇的贝叶斯方法
朴素贝叶斯理论推导与三种常见模型
机器学习实战