相关代码 👉 https://github.com/xiligey/npml/blob/master/npml/classify/naive_bayes.py
几个基本概念
介绍朴素贝叶斯之前,先看几个基本概念
条件概率
P
(
A
∣
B
)
P(A|B)
P(A∣B): 事件B发生的前提下A发生的概率
P
(
A
B
)
P(AB)
P(AB): 事件A和B同时发生的概率
P ( A ∣ B ) = P ( A B ) P ( B ) (1) P(A|B)=\frac {P(AB)} {P(B)} \tag {1} P(A∣B)=P(B)P(AB)(1)
当 A , B A,B A,B两个事件独立时, P ( A ∣ B ) = P ( A ) P(A|B)=P(A) P(A∣B)=P(A), 此时 P ( A B ) = P ( A ) ∗ P ( B ) P(AB)=P(A)*P(B) P(AB)=P(A)∗P(B)
全概率公式
若事件
B
1
,
B
2
,
.
.
.
,
B
n
B_1,B_2,...,B_n
B1,B2,...,Bn是样本空间
Ω
\Omega
Ω的一个划分,则
P
(
A
)
=
P
(
A
B
1
)
+
P
(
A
B
2
)
,
.
.
.
,
+
P
(
A
B
n
)
=
∑
i
=
1
n
P
(
A
B
i
)
(2)
P(A)=P(AB_1)+P(AB_2),...,+P(AB_n)=\sum_{i=1}^nP(AB_i) \tag {2}
P(A)=P(AB1)+P(AB2),...,+P(ABn)=i=1∑nP(ABi)(2)
全概率公式的好处在于,当一个事件的概率不好计算时,可以转化为条件概率来计算
贝叶斯公式
由公式1可得,
P
(
A
B
)
=
P
(
A
∣
B
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
(3)
P(AB)=P(A|B)P(B)=P(B|A)P(A) \tag {3}
P(AB)=P(A∣B)P(B)=P(B∣A)P(A)(3)
则
P
(
B
∣
A
)
=
P
(
A
∣
B
)
P
(
B
)
P
(
A
)
(4)
P(B|A)=\frac {P(A|B)P(B)} {P(A)} \tag {4}
P(B∣A)=P(A)P(A∣B)P(B)(4)
将公式2代入公式4,可得
P
(
B
∣
A
)
=
P
(
A
∣
B
)
P
(
B
)
P
(
A
)
=
P
(
A
∣
B
)
P
(
B
)
∑
i
=
1
n
P
(
A
B
i
)
(5)
P(B|A)=\frac {P(A|B)P(B)} {P(A)}=\frac {P(A|B)P(B)} {\sum_{i=1}^nP(AB_i)} \tag {5}
P(B∣A)=P(A)P(A∣B)P(B)=∑i=1nP(ABi)P(A∣B)P(B)(5)
朴素贝叶斯的算法原理
如上,已经得到公式5,我们将 A , B A,B A,B都赋予在实际的应用场景——垃圾邮件上:
id | A 1 A_1 A1 | A 2 A_2 A2 | … | A n A_n An | 垃圾邮件 |
---|---|---|---|---|---|
1 | 1 | 1 | … | 1 | 是 |
2 | 1 | 1 | … | 0 | 是 |
3 | 1 | 0 | … | 1 | 是 |
4 | 1 | 0 | … | 0 | 是 |
5 | 0 | 1 | … | 0 | 否 |
6 | 0 | 0 | … | 0 | 否 |
… | … | … | … | … | … |
假设我们从邮件中提取到了n个关键字 A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1,A2,...,An,这n个关键字组成了样本空间 Ω \Omega Ω
-
A
A
A: 代表特征(可理解为训练集的一条记录),有n个元素,
[
f
(
该
邮
件
是
否
包
含
关
键
字
A
1
)
,
f
(
该
邮
件
是
否
包
含
关
键
字
A
2
)
,
.
.
.
,
f
(
该
邮
件
是
否
包
含
关
键
字
A
n
)
]
[f(该邮件是否包含关键字A_1), f(该邮件是否包含关键字A_2),...,f(该邮件是否包含关键字A_n)]
[f(该邮件是否包含关键字A1),f(该邮件是否包含关键字A2),...,f(该邮件是否包含关键字An)]
其中 f ( A i ) = { 1 , 包 含 该 关 键 字 0 , 不 包 含 该 关 键 字 f(A_i)=\begin{cases} 1, & 包含该关键字\\ 0,& 不包含该关键字\end{cases} f(Ai)={1,0,包含该关键字不包含该关键字 -
B
B
B: 代表类别,存在两个类别
- B 1 B_1 B1: 这封邮件是垃圾邮件
- B 2 B_2 B2: 这封邮件不是垃圾邮件
- P ( B 1 ∣ A ) P(B_1|A) P(B1∣A): 当特征为 [ f ( 该 邮 件 是 否 包 含 关 键 字 A 1 ) , f ( 该 邮 件 是 否 包 含 关 键 字 A 2 ) , . . . , f ( 该 邮 件 是 否 包 含 关 键 字 A n ) ] [f(该邮件是否包含关键字A_1), f(该邮件是否包含关键字A_2),...,f(该邮件是否包含关键字A_n)] [f(该邮件是否包含关键字A1),f(该邮件是否包含关键字A2),...,f(该邮件是否包含关键字An)]时,该邮件是垃圾邮件的概率
- P ( B 2 ∣ A ) P(B_2|A) P(B2∣A): 当特征为 [ f ( 该 邮 件 是 否 包 含 关 键 字 A 1 ) , f ( 该 邮 件 是 否 包 含 关 键 字 A 2 ) , . . . , f ( 该 邮 件 是 否 包 含 关 键 字 A n ) ] [f(该邮件是否包含关键字A_1), f(该邮件是否包含关键字A_2),...,f(该邮件是否包含关键字A_n)] [f(该邮件是否包含关键字A1),f(该邮件是否包含关键字A2),...,f(该邮件是否包含关键字An)]时,该邮件不是垃圾邮件的概率
我们只需要算出 P ( B 1 ∣ A ) P(B_1|A) P(B1∣A)和 P ( B 2 ∣ A ) P(B_2|A) P(B2∣A),取概率大的那一类作为分类结果即可。
于是问题变成了:
a
r
g
m
a
x
i
(
P
(
B
1
∣
A
)
,
P
(
B
2
∣
A
)
)
(6)
argmax_i(P(B_1|A),P(B_2|A)) \tag {6}
argmaxi(P(B1∣A),P(B2∣A))(6),其中
i
∈
{
1
,
2
}
i\in \{1,2\}
i∈{1,2}
将公式5带入6可得:
a
r
g
m
a
x
i
(
P
(
B
1
∣
A
)
,
P
(
B
2
∣
A
)
)
=
a
r
g
m
a
x
i
(
P
(
A
∣
B
1
)
P
(
B
1
)
∑
i
=
1
2
P
(
A
B
i
)
,
P
(
A
∣
B
2
)
P
(
B
2
)
∑
i
=
1
2
P
(
A
B
i
)
)
(7)
argmax_i(P(B_1|A),P(B_2|A))=argmax_i(\frac {P(A|B_1)P(B_1)} {\sum_{i=1}^2P(AB_i)},\frac {P(A|B_2)P(B_2)} {\sum_{i=1}^2P(AB_i)}) \tag{7}
argmaxi(P(B1∣A),P(B2∣A))=argmaxi(∑i=12P(ABi)P(A∣B1)P(B1),∑i=12P(ABi)P(A∣B2)P(B2))(7)
公式7中分母相同,则问题可简化为
a
r
g
m
a
x
i
(
P
(
A
∣
B
1
)
P
(
B
1
)
,
P
(
A
∣
B
2
)
P
(
B
2
)
)
(8)
argmax_i(P(A|B_1)P(B_1),P(A|B_2)P(B_2)) \tag{8}
argmaxi(P(A∣B1)P(B1),P(A∣B2)P(B2))(8)
上文说到,事件
A
A
A可理解为训练集的任意一条记录,不妨令事件
A
A
A等于:
A
1
=
1
,
A
2
=
0
,
.
.
.
,
A
n
=
0
A_1=1,A_2=0,...,A_n=0
A1=1,A2=0,...,An=0
则:
P
(
A
∣
B
1
)
=
P
(
A
1
=
1
,
A
2
=
0
,
.
.
.
,
A
n
=
0
∣
B
1
)
=
P
(
A
1
=
1
∣
B
1
)
∗
P
(
A
2
=
0
∣
B
1
)
∗
.
.
.
∗
P
(
A
n
=
0
∣
B
1
)
=
∏
i
=
1
n
P
(
A
i
=
1
o
r
0
∣
B
1
)
(9)
\begin{aligned} P(A|B_1)& =P(A_1=1,A_2=0,...,A_n=0|B_1) \\ & =P(A_1=1|B_1)*P(A_2=0|B_1)*...*P(A_n=0|B_1)\\ & = \prod_{i=1}^nP(A_i=1 \ or\ 0|B_1)\end{aligned} \tag{9}
P(A∣B1)=P(A1=1,A2=0,...,An=0∣B1)=P(A1=1∣B1)∗P(A2=0∣B1)∗...∗P(An=0∣B1)=i=1∏nP(Ai=1 or 0∣B1)(9)
于是,最终需要求解的问题为: a r g m a x i ( ∏ i = 1 n P ( A i = 1 o r 0 ∣ B 1 ) , ∏ i = 1 n P ( A i = 1 o r 0 ∣ B 2 ) ) argmax_i(\prod_{i=1}^nP(A_i=1 \ or\ 0|B_1),\prod_{i=1}^nP(A_i=1 \ or\ 0|B_2)) argmaxi(i=1∏nP(Ai=1 or 0∣B1),i=1∏nP(Ai=1 or 0∣B2))
怎么求解 P ( A 1 = 1 ∣ B 1 ) P(A_1=1 |B_1) P(A1=1∣B1)?
在训练集中过滤出所有是垃圾邮件的数据,计数为 m m m,其中 A 1 = 1 A_1=1 A1=1有 n n n条,则 P ( A 1 = 1 ∣ B 1 ) = n m P(A_1=1 |B_1)=\frac n m P(A1=1∣B1)=mn