引言
贝叶斯算法的思想可以概括为选择后验概率最大的类为分类标签,先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率,可以通过先验概率和数据一起计算得到。一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化。如今在很多可以具体统计的领域,贝叶斯理论很好用,比如文本分类、垃圾文本过滤,情感判别,多分类实时预测等。
算法介绍
下面用一个简单的摸球游戏来说明这个算法:
例: 一号框(C1)有10个黑球和40个白球,二号框(C2)有30个黑球和20个白球。现在随机选择一个框,从中摸出一个球,发现是白球。问这个白球(X)最可能来自哪个框?
这类问题可以借助贝叶斯公式来计算,不需要针对目标变量建立模型。在分类时,通过计算样本属于各个类别的概率,然后取概率值大的类别作为分类类别。
P(X|C): 条件概率(已知)-------->C中出现X的概率
P(C ): 先验概率(已知) --------->C出现的概率
P(C|X): 后验概率(未知)-------->X属于C类的概率
以上有C1和C2两个类,由于P(X)都是一样的,所以不需要考虑P(X),只需要考虑如下:
如果 P(X|C1)P(C1) > P(X|C2)P(C2),则 P(C1|X) > P(C2|X),得 X 属于C1;
如果 P(X|C1) P(C1) < P(X|C2) P(C2),则 P(C2|X) < P(C2|X),得 X 属于C2。
A:上例中,白球(X)的概率P(X)=3/5
P(X|C1): 一号框中白球的概率 ------------------>4/5
P(X|C2): 二号框中白球的概率 ------------------>2/5
P(C1)=P(C2): 两个框被选中的概率相同 ----->1/2
B:则白球来自两个框的概率分别为:
白球来自一号框的概率--------->P(C1|X) = P(X|C1)P(C1)/P(X)=2/3
白球来自二号框的概率--------->P(C2|X) = P(X|C2)P(C2)/P(X)=1/3
P(C1|X) > P(C2|X)
因此白球最可能来自一号框。
这个简单的案例说明了贝叶斯算法的用法,然后我会具体的介绍下这个算法推导过程。如果不想看算法推导过程,可以直接看第二节,python的算法案例。
公式
在这里感谢刘建平Pinard前辈的公式推导过程,后面给出链接朴素贝叶斯算法原理小结
独立公式: 如果X, Y相互独立
P
(
X
,
Y
)
=
P
(
X
)
P
(
Y
)
P(X, Y) = P(X)P(Y)
P(X,Y)=P(X)P(Y)
条件概率公式:
P
(
Y
∣
X
)
=
P
(
X
,
Y
)
/
P
(
X
)
P
(
X
∣
Y
)
=
P
(
X
,
Y
)
/
P
(
Y
)
—
—
—
—
—
—
—
—
—
—
—
—
—
—
P
(
Y
∣
X
)
=
P
(
X
∣
Y
)
P
(
Y
)
/
P
(
X
)
P
(
X
∣
Y
)
=
P
(
Y
∣
X
)
P
(
X
)
/
P
(
Y
)
P(Y|X) = P(X, Y)/P(X) \\ P(X|Y) = P(X, Y)/P(Y) \\ —————————————— \\ P(Y|X) = P(X|Y)P(Y)/P(X) \\ P(X|Y) = P(Y|X)P(X)/P(Y) \\
P(Y∣X)=P(X,Y)/P(X)P(X∣Y)=P(X,Y)/P(Y)——————————————P(Y∣X)=P(X∣Y)P(Y)/P(X)P(X∣Y)=P(Y∣X)P(X)/P(Y)
全概率公式:
P
(
X
)
=
∑
k
P
(
X
∣
Y
=
Y
k
)
P
(
Y
k
)
其
中
∑
k
P
(
Y
k
)
=
1
P(X) = \sum_{k}P(X|Y=Y_k)P(Y_k)其中 \sum_{k}P(Y_k)=1
P(X)=k∑P(X∣Y=Yk)P(Yk)其中k∑P(Yk)=1
得到贝叶斯公式:
P
(
Y
k
∣
X
)
=
P
(
X
∣
Y
k
)
P
(
Y
k
)
∑
k
P
(
X
∣
Y
=
Y
k
)
P
(
Y
k
)
P(Y_k|X) =\frac{P(X|Y_k)P(Y_k)}{ \sum_kP(X|Y=Y_k)P(Y_k)}
P(Yk∣X)=∑kP(X∣Y=Yk)P(Yk)P(X∣Yk)P(Yk)
贝叶斯模型
朴素贝叶斯常用的三个模型有:
- 高斯模型:处理特征是连续型变量的情况
- 多项式模型:最常见,要求特征是离散数据
- 伯努利模型:要求特征是离散的,且为布尔类型,即true和false,或者1和0
假设分类模型有count(test)=m个样本,每个样本有n个特征,特征输出有K个类别,定义为
C
1
,
C
2
,
.
.
.
,
C
k
C1,C2,...,C_k
C1,C2,...,Ck,每个特征的输出类别为样本个数为
m
1
,
m
2
,
.
.
.
m
k
m_1,m_2,...m_k
m1,m2,...mk。在第k个类别中,如果是离散特征,则特征
X
i
X_i
Xi各个类别取值为
m
i
l
m_{il}
mil,
l
=
1
,
2
,
3
,
.
.
.
,
S
i
l=1,2,3,...,S_i
l=1,2,3,...,Si,其中
S
i
S_i
Si为特征i的不同取值数。
(
x
1
(
1
)
x
2
(
1
)
.
.
.
x
n
(
1
)
x
1
(
2
)
x
2
(
2
)
.
.
.
x
n
(
2
)
.
.
.
.
.
.
.
.
.
.
.
.
x
1
(
m
)
x
2
(
m
)
.
.
.
x
n
(
m
)
)
=
(
X
(
1
)
X
(
2
)
.
.
.
X
(
m
)
)
\begin{pmatrix} x_1^{(1)} & x_2^{(1)} & ... & x_n^{(1)}\\ x_1^{(2)} & x_2^{(2)} & ... & x_n^{(2)}\\ ... & ... & ... & ...\\ x_1^{(m)} & x_2^{(m)} & ... & x_n^{(m)}\\ \end{pmatrix}= \begin{pmatrix} X^{(1)}\\ X^{(2)}\\ ...\\ X^{(m)} \end{pmatrix}
⎝⎜⎜⎜⎛x1(1)x1(2)...x1(m)x2(1)x2(2)...x2(m)............xn(1)xn(2)...xn(m)⎠⎟⎟⎟⎞=⎝⎜⎜⎛X(1)X(2)...X(m)⎠⎟⎟⎞
step1: 计算先验分布
P
(
Y
=
C
k
)
(
k
=
1
,
2
,
.
.
.
,
K
)
P(Y=C_k)(k=1,2,...,K)
P(Y=Ck)(k=1,2,...,K)
step2: 条件概率分布
P
(
X
=
x
∣
Y
=
C
k
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)
P(X=x∣Y=Ck)=P(X1=x1,X2=x2,...Xn=xn∣Y=Ck)
step3: 用贝叶斯公式得到X,Y的联合分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y)
P
(
X
,
Y
=
C
k
)
=
P
(
Y
=
C
k
)
P
(
X
=
x
∣
Y
=
C
k
)
=
P
(
Y
=
C
k
)
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
P(X,Y=C_k)\\=P(Y=C_k)P(X=x|Y=C_k)\\ \\=P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)
P(X,Y=Ck)=P(Y=Ck)P(X=x∣Y=Ck)=P(Y=Ck)P(X1=x1,X2=x2,...Xn=xn∣Y=Ck)
step4: P ( Y = C k ) P(Y=C_k) P(Y=Ck)可由最大似然估计法求出。得到的 P ( Y = C k ) P(Y=C_k) P(Y=Ck)就是类别 C k C_k Ck在训练集中出现的频数。
step5: 因为
P
(
X
=
x
1
,
X
=
x
2
,
.
.
.
X
=
x
n
∣
Y
=
C
k
)
P(X=x_1, X=x_2,...X=x_n|Y=C_k)
P(X=x1,X=x2,...X=xn∣Y=Ck)很难求出。朴素贝叶斯模型在这里大胆假设X的n个维度之间相互独立。那么就能得到
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)\\ =P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)
P(X1=x1,X2=x2,...Xn=xn∣Y=Ck)=P(X1=x1,X2=x2,...Xn=xn∣Y=Ck)
从上式看出大大简化了条件分布,但是也带了很大的预测不确定性,因为上式是在特征相对独立的情况下作出的假设。因此特征之间耦合性较高,就不要使用这个方法了。
step6: 最后通过贝叶斯公式,使得后验概率最大化来判断分类。计算出k个条件概率 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck∣X=X(test)),然后找出最大的条件概率对应的类别 C k C_k Ck
step7: 朴素贝叶斯的推断过程
C
r
e
s
u
l
t
=
a
r
g
m
a
x
⎵
C
k
P
(
Y
=
C
k
∣
X
=
X
(
t
e
s
t
)
)
=
a
r
g
m
a
x
⎵
C
k
P
(
X
=
X
(
t
e
s
t
)
∣
Y
=
C
k
)
P
(
Y
=
C
k
)
P
(
X
=
X
(
t
e
s
t
)
)
C_{result} = \underset{C_k}{\underbrace{argmax}}P(Y=C_k|X=X^{(test)})\\ = \frac{\underset{C_k}{\underbrace{argmax}}P(X=X^{(test)}|Y=C_k)P(Y=C_k)}{P(X=X^{(test)})}
Cresult=Ck
argmaxP(Y=Ck∣X=X(test))=P(X=X(test))Ck
argmaxP(X=X(test)∣Y=Ck)P(Y=Ck)
对于所有的类别计算
P
(
Y
=
C
k
∣
X
=
X
(
t
e
s
t
)
)
P(Y=C_k|X=X^{(test)})
P(Y=Ck∣X=X(test))时,分母都相同
P
(
X
=
X
(
t
e
s
t
)
)
=
1
t
e
s
t
{P(X=X^{(test)})} = \frac{1}{test}
P(X=X(test))=test1,因此预测公式可以简化为
C
r
e
s
u
l
t
=
a
r
g
m
a
x
⎵
C
k
P
(
Y
=
C
k
∣
X
=
X
(
t
e
s
t
)
)
=
a
r
g
m
a
x
⎵
C
k
P
(
X
=
X
(
t
e
s
t
)
∣
Y
=
C
k
)
P
(
Y
=
C
k
)
C_{result} = \underset{C_k}{\underbrace{argmax}}P(Y=C_k|X=X^{(test)})\\ =\underset{C_k}{\underbrace{argmax}}P(X=X^{(test)}|Y=C_k)P(Y=C_k)
Cresult=Ck
argmaxP(Y=Ck∣X=X(test))=Ck
argmaxP(X=X(test)∣Y=Ck)P(Y=Ck)
接着利用朴素贝叶斯的独立性假设,得到通常意义上的朴素贝叶斯公式
C
r
e
s
u
l
t
=
a
r
g
m
a
x
⎵
C
k
P
(
Y
=
C
k
∣
X
=
X
(
t
e
s
t
)
)
=
a
r
g
m
a
x
⎵
C
k
P
(
Y
=
C
k
)
∏
i
=
1
n
P
(
X
=
X
i
(
t
e
s
t
)
∣
Y
=
C
k
)
C_{result} = \underset{C_k}{\underbrace{argmax}}P(Y=C_k|X=X^{(test)})\\ =\underset{C_k}{\underbrace{argmax}}P(Y=C_k)\prod_{i=1}^n P(X=X_i^{(test)}|Y=C_k)
Cresult=Ck
argmaxP(Y=Ck∣X=X(test))=Ck
argmaxP(Y=Ck)i=1∏nP(X=Xi(test)∣Y=Ck)
朴素贝叶斯的参数估计
以上结果知道只要求出 P ( Y = C k ) P(Y=C_k) P(Y=Ck)和 P ( X = X i ( t e s t ) ∣ Y = C k ) ( i = 1 , 2 , . . . , n ) P(X=X_i^{(test)}|Y=C_k)(i=1,2,...,n) P(X=Xi(test)∣Y=Ck)(i=1,2,...,n)就可以得到朴素贝叶斯的推断结果。这一节介绍如何通过训练集计算这两个概率。
A:对于
P
(
Y
=
C
k
)
P(Y=C_k)
P(Y=Ck),通过极大似然估计我们很容易得到
P
(
Y
=
C
k
)
P(Y=C_k)
P(Y=Ck)为样本类别
C
k
C_k
Ck出现的频率
P
(
Y
=
C
k
)
=
样
本
类
别
C
k
出
现
的
次
数
m
k
样
本
总
数
m
P(Y=C_k) = \frac{样本类别C_k出现的次数m_k}{样本总数m}
P(Y=Ck)=样本总数m样本类别Ck出现的次数mk
B:对于 P ( X = X i ( t e s t ) ∣ Y = C k ) ( i = 1 , 2 , . . . , n ) P(X=X_i^{(test)}|Y=C_k)(i=1,2,...,n) P(X=Xi(test)∣Y=Ck)(i=1,2,...,n),这个取决于我们的先验条件。对应三个常用的三个模型
-
高斯模型: 如果 X i X_i Xi是连续值,我们通常取X的先验概率为正态分布,即在样本类别 C k C_k Ck中, X i X_i Xi的值符合正态分布,这样 P ( X = X i ( t e s t ) ∣ Y = C k ) P(X=X_i^{(test)}|Y=C_k) P(X=Xi(test)∣Y=Ck)的概率分布为:
P ( X = X i ( t e s t ) ∣ Y = C k ) = 1 2 π σ k e x p ( − ( X i ( t e s t ) − μ k ) 2 2 σ k 2 ) P(X=X_i^{(test)}|Y=C_k)\\ =\frac{1}{2\pi \sigma_k}exp(-\frac{(X_i^{(test)}-\mu_k )^2}{2\sigma_k^2}) P(X=Xi(test)∣Y=Ck)=2πσk1exp(−2σk2(Xi(test)−μk)2)
其中 μ k \mu_k μk和 σ k 2 \sigma_k^2 σk2分别是正态分布的均值和方差,可以通过极大似然估计求得。 μ k \mu_k μk为在样本类别 C k C_k Ck中,所有 x i x_i xi的平均值, σ k 2 \sigma_k^2 σk2为在样本类别 C k C_k Ck中,所有 x i x_i xi的方差,对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。 -
多项式模型: 如果我们的 X i X_i Xi是离散的值,那么我们可以假设 X i X_i Xi符合多项式分布,这样得到 P ( X = X i ( t e s t ) ∣ Y = C k ) P(X=X_i^{(test)}|Y=C_k) P(X=Xi(test)∣Y=Ck)是在样本类别 C k C_k Ck中,特征 X i ( t e s t ) X_i^{(test)} Xi(test)出现的频率。即:
P ( X = X i ( t e s t ) ∣ Y = C k ) = 类 别 C k 中 , i 维 特 征 X i ( t e s t ) 出 现 的 次 数 m k i ( t e s t ) 样 本 类 别 C k 总 的 特 征 计 数 m k P(X=X_i^{(test)}|Y=C_k)=\frac{类别C_k中,i维特征X_i^{(test)}出现的次数m_{ki}^{(test)}}{样本类别C_k总的特征计数m_k} P(X=Xi(test)∣Y=Ck)=样本类别Ck总的特征计数mk类别Ck中,i维特征Xi(test)出现的次数mki(test)
拉普拉斯平滑:
这里有一个问题,当某个分量在总样本某个分类中(观察样本库/训练集)从没出现过,会导致整个实例 P ( X = X i ( t e s t ) ∣ Y = C k ) P(X=X_i^{(test)}|Y=C_k) P(X=Xi(test)∣Y=Ck)的计算结果为0。为了解决这个问题,使用拉普拉斯平滑进行处理。
它的思想非常简单,就是对先验概率的分子(划分的计数)加大于0的常数 λ \lambda λ,分母加上类别数 k ∗ λ k*\lambda k∗λ;对条件概率分子加 λ \lambda λ,分母加上对应特征i的可能取值数量 O i ∗ λ O_i*\lambda Oi∗λ。这样在解决零概率问题的同时,也保证了概率和依然为1。
P ( Y = C k ) = m k + λ m + k λ P(Y=C_k) = \frac{m_k+\lambda}{m+k\lambda} P(Y=Ck)=m+kλmk+λ
P ( X = X i ( t e s t ) ∣ Y = C k ) = m k i ( t e s t ) + λ m k + O i λ P(X=X_i^{(test)}|Y=C_k) = \frac {m_{ki}^{(test)}+\lambda}{m_k+O_i\lambda } P(X=Xi(test)∣Y=Ck)=mk+Oiλmki(test)+λ
注: λ \lambda λ是一个大于0的常数, O i O_i Oi是第i个特征的取值个数k
eg:假设在文本分类中,有3个类,C1、C2、C3,在指定的训练样本中,某个词语F1,在各个类中观测计数分别为=0,990,10,即概率为P(F1/C1)=0,P(F1/C2)=0.99,P(F1/C3)=0.01,对这三个量使用拉普拉斯平滑的计算方法如下:
1/1003 = 0.001,991/1003=0.988,11/1003=0.011
- 伯努利模型: 如果我们我们的
X
i
X_i
Xi是非常稀疏的离散值,即各个特征出现概率很低,这时我们可以假设
X
i
X_i
Xi符合伯努利分布,即特征
X
i
X_i
Xi出现记为1,不出现记为0。即只要
X
i
X_i
Xi出现即可,我们不关注
X
i
X_i
Xi的次数。这样得到
P
(
X
=
X
i
(
t
e
s
t
)
∣
Y
=
C
k
)
P(X=X_i^{(test)}|Y=C_k)
P(X=Xi(test)∣Y=Ck)是在样本类别
C
k
C_k
Ck中,
X
i
(
t
e
s
t
)
X_i^{(test)}
Xi(test)出现的频率。此时有:
P ( X = X i ( t e s t ) ∣ Y = C k ) = P ( X i ∣ Y = C k ) X i ( t e s t ) + ( 1 − P ( X i ∣ Y = C k ) ) ( 1 − X i ( t e s t ) ) P(X=X_i^{(test)}|Y=C_k)=P(X_i|Y=C_k)X_i^{(test)}+(1-P(X_i|Y=C_k))(1-X_i^{(test)}) P(X=Xi(test)∣Y=Ck)=P(Xi∣Y=Ck)Xi(test)+(1−P(Xi∣Y=Ck))(1−Xi(test))
其中 X i ( t e s t ) X_i^{(test)} Xi(test)的取值为0和1
算法小结
朴素贝叶斯的主要优点有:
1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
2)对小规模的数据表现很好,能够处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
朴素贝叶斯的主要缺点有:
1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
4)对输入数据的表达形式很敏感。