朴素贝叶斯法

贝叶斯法的数学基础——贝叶斯公式

朴素贝叶斯算法(Naive Bayesian)来源于概率论当中著名的贝叶斯定理
贝叶斯公式: $P(A|B)=\frac{P(B|A)P(A)}{P(B)}$
在朴素贝叶斯算法中,贝叶斯公式的意义在于,通过样本数据计算先验概率和条件概率,然后通过后验概率进行预测。

关于Naive的解释

朴素贝叶斯(Naive Bayesian)的“朴素(Naive)”之处在于,其假设了各个特征之间是独立的,这也是朴素贝叶斯算法的关键条件。不妨设一个样本数据$(x_i,y_i)$,其中$x_i=(x_i^{(1)},x_i^{(2)},…,x_i^{(n)})$,则根据条件独立性假设可得:
\begin{aligned}
P(x_i|y_i)&=P(x_i^{(1)},x_i^{(2)},…,x_i^{(n)}|y_i)\\
&=\prod_{j=1}^n P(x_i^{(j)}|y_i)
\end{aligned}相反的,对于特征之间相互关联的假设可参考贝叶斯网络等相关内容。

朴素贝叶斯法的原理

符号约定

输入:训练数据集$T=\lbrace(x_1,y_1),(x_2,y_2),…,(x_N,y_N)\rbrace$,其中:
$x_i=(x_i^{(1)},x_i^{(2)},…,x_i^{(n)})^{T} $,$ x_i^{(j)}$是第$i$个样本的第$j$个特征,$x_i^{(j)}\in \lbrace a_{j1},a_{j2},…,a_{jS_j}\rbrace$,$j=1,2,…,n$;
$ y_i\in\lbrace c_1,c_2,…,c_k\rbrace $,$c_i$是输出空间的第$i$个值,$i=1,2,…,K$;
需要预测的实例$x_{test}$;
输出:实例$x_{test}$的分类$y_{test}$;

训练过程

(1)首先计算先验概率$P(Y=c_{k})$的极大似然估计$$P(Y=c_{k})=\frac{\sum_{i=1}^N I(y_i=c_{k})}{N},k=1,2,…,K$$

(2)然后计算条件概率$P(X^{(j)}=a_{jl}|Y=c_{k})$的极大似然估计
$$P(X^{(j)}=a_{jl}|Y=c_{k})=\frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_{k})}{\sum_{i=1}^NI(y_i=c_{k})}$$

$j=1,2,…,n;\quad l=1,2,…,S_j;\quad k=1,2,…,K$
其中,$n$表示特征数,$K$表示分类的数量,$a_{jl}$是输入空间第$j$特征的第$l$个值,$S_j$表示第$j$个特征可能的取值个数。

预测

确定实例$x_{test}$的分类$y_{test}$,即有
$$ y_{test}=f(x_{test})=\arg\max_{c_{k}} \frac{P(Y=c_{k}) P(X=x_{test}|Y=c_{k})}{\sum_{i=1}^{K}P(Y=c_{k}) P(X=x_{test}|Y=c_{k})} $$

如果直接计算上面的式子显然是很复杂的,故可进一步的化简,过程如下:
(1)由于上式中分母中对所有的$c_{k}$相同,故只需对分子部分求最大值
$$ y_{test}=\arg\max_{c_{k}} P(Y=c_{k}) P(X=x_{test}|Y=c_{k}) $$

(2)由于贝叶斯方法采用了条件独立性假设,则进一步有
$$ P(X=x_{test}|Y=c_{k})=\prod_{j=1}^NP(X^{(j)}=x_{test}^{(j)}|Y=c_{k}), k=1,2,…,K $$

于是对于给定的实例$x_{test}$,其分类$y_{test}$可表示为
$$ y_{test}=\arg\max_{c_{k}} P(Y=c_{k})\prod_{j=1}^N P(X^{(j)}=x_{test}^{(j)}|Y=c_{k}) $$

在朴素贝叶斯中,需要学习和估计的是先验概率$P(Y=c_{k})$和$P(X^{(j)}=a_{jl}|Y=c_{k})$条件概率。

后验概率最大化的含义

朴素贝叶斯法将实例分到后验概率最大的类别中,这等价于经验风险最小化。在经验风险中,朴素贝叶斯法使用了0-1损失函数,并根据经验风险最小化的原则推导出后验概率最大化的结果。其实际含义就是上面所叙的预测过程中,对于给定的实例$x_{test}$,计算该实例对于输出空间中任意分类$c_{k}$的的概率$y_{test}^{(k)}$,并选取概率最大的作为预测分类的结果。具体的推导过程参考《统计学习方法》的相关章节。

拉普拉斯平滑

在训练过程中,用极大似然估计可能会出现所要估计的概率为0的情况,这时会影响到后验概率的计算,使得分类产生误差,而解决这一问题的方法是使用拉普拉斯平滑(Laplace Smoothing)。
对于先验概率的计算:
$$ P(Y=c_{k})=\frac{\sum_{i=1}^N I(y_i=c_{k})+\lambda}{N+K\lambda},k=1,2,…,K $$

对于条件概率的计算:
$$ P(X^{(j)}=x_{jl}|Y=c_{k})=\frac{\sum_{i=1}^NI(X^{(j)}=x_{jl},y_i=c_{k})+\lambda}{\sum_{i=1}^NI(y_i=c_{k})+S_j\lambda} $$

其中$\lambda\geq0$,其等价于随机变量各个频数取值上赋予一个正数,这样就保证不出现概率为0的情况。
但是,在采用了了拉普拉斯平滑之后,对于给定实例$x_{test}$的所计算出来的各个分类的概率$y_{test}^{(k)}$,其和可能不等于1。

其他

朴素贝叶斯法实现简单,学习效率和预测效率都很高,常用于文本分类(比如对识别垃圾邮件)。

朴素贝叶斯法的两种模型

朴素贝叶斯法有两种常用的模型,一个是伯努利模型(Bernoulli Naive Bayes),一种是多项式模型(Multinomial Naive Bayes)。
以文本分类为例,两种模型都选取文本中的单词作为特征,区别在于关注单词的粒度不同。
伯努利模型中,特征的取值是布尔型的,表示单词表中的单词是否在给定文档中出现过。在多项式模型中,特征的取值为自然数,表示单词表中的单词在给定文档中出现过的次数。
更详细的内容参考基于朴素贝叶斯的文本分类算法

高斯模型

与前面两者不同的是,高斯模型的随机变量为连续型。但在实际应用中,通常会将连续的随机变量转化为离散型进行建模。详细的算法内容有待研究。

参考资料

[1] 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
[2] 基于朴素贝叶斯的文本分类算法
[3] Naive Bayes的Python实现
[4] 高斯判别分析和朴素贝叶斯
[4] 斯坦福大学公开课—机器学习课程—06朴素贝叶斯法