朴素贝叶斯(Naive Bayes)适用于离散特征的分类问题,对于连续问题则需将特征离散化后使用。朴素贝叶斯有多元伯努利事件模型和多项式事件模型,在伯努利事件模型中,特征每一维的值只能是0或1,而多项式模型中特征每一维的值可取0到N之间的整数,因此伯努利模型是多项式模型的一种特例,下面的推导就直接使用伯努利模型。
朴素贝叶斯原理推导
与GDA类似,朴素贝叶斯对一个测试样本分类时,通过比较p(y=0|x)和p(y=1|x)来进行决策。根据贝叶斯公式:
\( \begin{aligned} p(y=1|x)=\frac{p(x|y=1)p(y=1)}{p(x)} \end{aligned}\)
其中x是一个多维向量,\(x=(x_1,x_2,…,x_n)\),则
\( \begin{aligned} p(x|y)=p(x_1|y)p(x_2|y,x_1)p(x_3|y,x_1,x_2)…p(x_n|y,x_1,x_2,…,x_{n-1}) \end{aligned}\)
上面这个式子如此多的条件概率,可没法求呀。那么就限定一下条件,使得特殊情况下可以求解,于是就有了下面这个很Naive的假设:
在给定类别y的条件下,\(x_i\;(i=1,2,…,n)\)直接相互独立。
这个假设表达的意思是在每个类别内部,特征x的每一维与其他维没有关系,需要注意的是此条件独立并不等价于完全独立。这个假设的直观表达是:
\( \begin{aligned} p(x_i|y,x_j)= p(x_i|y,x_j)\;(all\; i \neq j) \end{aligned}\)
基于此假设,上面的公式就可写成:
\( \begin{aligned} p(x|y)=p(x_1|y)p(x_2|y)p(x_3|y)…p(x_n|y)=\prod_{i=1}^n{p(x_i|y)} \end{aligned}\)
对于一个训练样本集合\( \{(x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\}\),\(x^{(i)}=(x^{(i)}_1,x^{(i)}_2,...,x^{(i)}_n)\),\( n_i=\sum_{j=1}^n{x^{(i)}_j}\),其似然函数为:
\( \begin{aligned} L&=\prod_{i=1}^m{p(x^{(i)},y^{(i)})} \\&=\prod_{i=1}^m{p(x^{(i)}|y^{(i)})p(y^{(i)})} \\&=\prod_{i=1}^m{\prod_{j=1}^{n_i}p(x^{(i)}_j|y^{(i)})p(y^{(i)})} \end{aligned} \)
与高斯判别分析中的推导类似,对似然函数取对数并最大化,通过求导可求解出:
\( \begin{aligned} \phi_{k|y=1}=p(x^{(i)}=k|y=1)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=1)}}{\sum_{i=1}^m{I(y^{(i)}=1)n_i}}\end{aligned}\)
\( \begin{aligned} \phi_{k|y=0}=p(x^{(i)}=k|y=0)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=0)}}{\sum_{i=1}^m{I(y^{(i)}=0)n_i}}\end{aligned}\)
\( \begin{aligned} \phi_y=p(y=1)=\frac{\sum_{i=1}^m{I(y^{(i)}=1)}}{m} \end{aligned}\)
式中I为指示函数。
拉普拉斯平滑
对于上面推导的公式,假设\(x_i\)的理论取值范围是0~99,但我们的训练样本中,没有任何一个样本中出现过99这个值,那么按照上面贝叶斯公式计算,会出现0/0的情况。基于这一点,对上面公式做一点修正,如下所示:
\( \begin{aligned} \phi_{k|y=1}=p(x_i=k|y=1)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=1)}+1}{\sum_{i=1}^m{I(y^{(i)}=1)n_i}+N} \end{aligned}\)
\( \begin{aligned} \phi_{k|y=0}=p(x_i=k|y=0)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=0)}+1}{\sum_{i=1}^m{I(y^{(i)}=0)n_i}+N} \end{aligned}\)
式中N即是\(x_i\)理论取值数。如此修正意义何在?做上述修正,对于理论上可能存在的状态,基本其多次试验没有发生,但我们也不否认其存在的可能性,只是认为其出现的可能性很小而已。一个直观的例子,我们都知道抛硬币正反面的概率都为0.5,但你抛100次却每次都是正面,即便如此相信你也不会认为抛出反面的概率是0吧?不过出现如此现象则可能让我怀疑此硬币设计有什么问题导致出现反面的概率如此之低。
朴素贝叶斯实现
到这里算法实现基本就是按照上面的公式来进行训练和判别了,在matlab的训练代码为:
1 %phi_0(k)=p(x_i=k|y=0) for any i 2 %phi_1(k)=p(x_i=k|y=1) for any i 3 %phi=p(y=1) 4 function [phi_0, phi_1, phi] = NaiveBayesTrain(Feature, Label, V) 5 idx0 = find(Label == 0); 6 idx1 = find(Label == 1); 7 8 %calc phi_y 9 phi = length(idx1) / length(Label); 10 11 n = sum(Feature, 2); 12 n0 = sum(n(idx0)); 13 n1 = sum(n(idx1)); 14 15 phi_0 = (sum(Feature(idx0, :), 1) + 1) / (n0 + V); 16 phi_1 = (sum(Feature(idx1, :), 1) + 1) / (n1 + V); 17 end