朴素贝叶斯(Naive Bayes)学习总结

朴素贝叶斯算法的基本思想是建立特征XX与输出 YY 之间的联合概率分布 P(X,Y)P(X, Y) ,在对给定的特征进行预测时,通过贝叶斯定理求出所有可能的输出 P(XY)P(X | Y) ,取其中最大的作为预测结果。其优点是模型简单,效率高,在很多领域有广泛的使用。

生成学习算法与判别学习算法

生成学习算法与判别学习算法是监督学习的两种方式,今天要说的朴素贝叶斯算法是生成算法的一种,而之前讲的逻辑回归与后面将要学习的SVM则是属于判别学习方法,我们首先要搞清楚两种算法的区别。
贴一张图片,我觉得可以很直观的看出两种学习算法的区别。
朴素贝叶斯(Naive Bayes)学习总结

对于监督学习来说,我们的目标始终是求出 P(YX)P(Y|X)判别学习算法会直接对P(YX)P(Y|X)进行建模,例如在逻辑回归中 P(YX;θ)=hθ(x)y(1hθ(x))1yP(Y|X;\theta)={h_\theta(x)}^{y}(1-{h_\theta(x)})^{1-y} ,当有一组需要预测的样本时,我们可以直接判别出他的输出类别,在图中可以明显看出,实际上判别算法是生成了一条判别边界的,在边界的两边会输出不同结果。生成学习算法是对 P(X,Y)P(X, Y)进行建模,在右图中,并不存在一个判别边界,而是对两类样本分别建模,当有一个红色小三角的输入时,根据条件概率公式分别计算出小三角属于蓝色以及黄色的概率,取较大的那个作为小三角的类别。

统计学理论基础

在了解朴素贝叶斯算法之前,我们需要一些统计学知识作为基础,下面的公式部分摘自《概率论与数理统计》,只是把其中的A,B换成了X,Y以方便理解。

  • 条件概率公式

假设X, Y是两个事件,以下公式表示事件X发生的条件(前提)下,事件Y发生的概率。
P(YX)=P(XY)P(X)P(Y|X) = \frac{P(XY)}{P(X)}

  • 条件概率的链式法则

P(x1,x2,...,xn)=P(x1)i=2nP(xix1,...,xi1)P(x_1 , x_2, ...,x_n) = P(x_1)\prod_{i=2}^{n}P(x_i|x_1,...,x_{i-1})

  • 事件相互独立

假设X, Y是两个事件,若满足以下等式则称事件X,Y相互独立。
P(XY)=P(X)P(Y)P(XY) = P(X) P(Y)

  • 全概率公式

如果事件Y1、Y2、Y3…Yn 构成一个完备事件组,即它们两两互不相容,其和为全集,则对任一事件X有
P(X)=nP(XYn)P(Yn)P(X) = \sum_{n}^{}{P(X|Y_n)P(Y_n)}

  • 贝叶斯公式

由条件概率公式可得
P(XY)=P(X)P(YX)=P(Y)P(XY)P(XY)=P(X)P(Y|X)=P(Y)P(X|Y)
P(YX)=P(XY)P(Y)P(X)P(Y|X) = \frac{P(X|Y)P(Y)}{P(X)}
将全概率公式带入,即得贝叶斯公式
P(YnX)=P(XYn)P(Yn)nP(XYn)P(Yn)P(Y_n|X) = \frac{P(X|Y_n)P(Y_n)}{\sum_{n}^{}{P(X|Y_n)P(Y_n)}}

算法原理

假设我们有训练集:
{x1(1),x2(1),...,xn(1),y(1)}\left\{ x_1^{(1)} ,x_2^{(1)},...,x_n^{(1)},y^{(1)}\right\}
{x1(2),x2(2),...,xn(2),y(2)}\left\{ x_1^{(2)} ,x_2^{(2)},...,x_n^{(2)},y^{(2)}\right\}
......
{x1(m),x2(m),...,xn(m),y(m)}\left\{ x_1^{(m)} ,x_2^{(m)},...,x_n^{(m)},y^{(m)}\right\}
其中,nn 表示特征数, mm 表示样本数,假设 {y(1),y(2),...,y(m)}{c1,c2,...,cK}\left\{ y^{(1)},y^{(2)},...,y^{(m)} \right\}\in\left\{ c_1,c_2,...,c_K\right\} ,分类结果有 KK 种取值可能。

下面对其中一个类别进行建模,考虑 y=cky=c_k 的一般情况。
P(X,Y=ck)=P(x1,x2,...,xn,Y=ck)P(X,Y=c_k) = P(x_1, x_2,...,x_n,Y=c_k)
将上式用条件概率的链式法则打开,得到
P(X,Y=ck)=P(x1,x2,...,xn,Y=ck)=P(Y=ck)P(x1Y=ck)P(x2Y=ck,x1)...P(X,Y=c_k) = P(x_1, x_2,...,x_n,Y=c_k) =P(Y=c_k)\bullet P(x_1|Y=c_k) \bullet P(x_2|Y=c_k, x_1) \bullet ...
注意到,后面的条件概率非常复杂(复杂到我都不想写了),有指数级数量的参数,这在实际中显然不可行,所以贝叶斯算法引入了一个非常强的假设,就是所有的特征都是条件独立的,这也是朴素两字的意思,上面的式子就可以简化为
=P(Y=ck)P(x1Y=ck)P(x2Y=ck)...P(xnY=ck)=P(Y=c_k)\bullet P(x_1|Y=c_k) \bullet P(x_2|Y=c_k) \bullet ...\bullet P(x_n|Y=c_k)
=P(Y=ck)i=1nP(xiY=ck)=P(Y=c_k)\prod_{i=1}^{n}P(x_i|Y=c_k)
根据贝叶斯公式,我们要求的
P(Y=ckX)=P(Y=ck)i=1nP(xiY=ck)j=1KP(XY=cj)P(Y=cj)P(Y=c_k|X)=\frac{P(Y=c_k)\prod_{i=1}^{n}P(x_i|Y=c_k)}{\sum_{j=1}^{K}{P(X|Y=c_j)P(Y=c_j)}}

算法预测过程

在给定训练集的情况下,假设需要预测的数据特征为 {f1,f2,...,fn}\left\{ f_1,f_2,...,f_n \right\} ,我们需要计算它属于每个类别的概率,并取最大值,即求:
argmaxckP(Y=ckX)arg max_{c_k} P(Y=c_k|X)
P(Y=ckX)P(Y=c_k|X) 的分母对每个 ckc_k 都是相同的,为了简化计算,舍去分母:
argmaxckP(Y=ck)i=1nP(xi=fiY=ck)arg max_{c_k} P(Y=c_k)\prod_{i=1}^{n}P(x_i=f_i|Y=c_k)

下面详细介绍上式各项怎么求出
P(Y=ck)P(Y=c_k) ,表示类别为 ckc_k 的概率,在样本数充足的情况下,可用 ck\frac{类别为c_k的样本数}{样本总数} 求得。

P(xi=fiY=ck)P(x_i=f_i|Y=c_k)表示在类别为ckc_k的情况下,类别取 fif_i 的概率。
第一种情况,若 xix_i 为离散属性, 可以用
ckifick\frac{在类别为c_k的样本中第i个属性为f_i的样本数}{类别为c_k的样本总数}
求得,需要注意的是,如果需要预测的数据中出现了训练数据集中没有出现过的特征,那么这个概率就会是0,将造成无法预测的情况,这显然不是我们想看到的。于是会在分子分母上各加上一个数,这个操作叫做拉普拉斯平滑,则上面的式子会变为 :
ckifi+1ck+i\frac{在类别为c_k的样本中第i个特征为f_i的样本数+1}{类别为c_k的样本总数+第i个特征可能的取值数}
第二种情况,若 xix_i 为连续属性,则考虑概率密度函数,假设在该类别上这个特征符合高斯分布,即 P(xiY=ck)(μ,σ2)P(x_i|Y=c_k)\sim\aleph(\mu,\sigma^2),其中 μ\muσ2\sigma^2 分别是类别为 ckc_k 的样本中第 ii 个特征取值的均值和方差。由此可以求出
P(xi=fiY=ck)=12πσexp((xiμ)22σ2)P(x_i=f_i|Y=c_k)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(x_i-\mu)^2}{2\sigma^2})
至此,算法的原理基本总结完毕,下面举个例子希望可以帮助大家理解。

举例说明

这个例子摘自西瓜书,具体说明了朴素贝叶斯算法的预测过程,还是具体的例子好理解啊,很棒!
训练集:
朴素贝叶斯(Naive Bayes)学习总结
需要预测的样本:
朴素贝叶斯(Naive Bayes)学习总结
各个概率的计算:
朴素贝叶斯(Naive Bayes)学习总结
离散型特征:
朴素贝叶斯(Naive Bayes)学习总结
连续型特征:
朴素贝叶斯(Naive Bayes)学习总结
最后判断:
朴素贝叶斯(Naive Bayes)学习总结
至此,朴素贝叶斯算法的原理总结就结束了,其实还有半朴素贝叶斯算法的,等以后遇到了研究一下再补上吧。如果你觉得有用的话不妨点个赞哦。

参考:
《机器学习》-周志华
《统计学习方法》-李航