机器学习系列——朴素贝叶斯

相关代码 👉 https://github.com/xiligey/npml/blob/master/npml/classify/naive_bayes.py

几个基本概念

介绍朴素贝叶斯之前,先看几个基本概念

条件概率

P ( A ∣ B ) P(A|B) P(AB): 事件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(AB)=P(B)P(AB)(1)

A , B A,B A,B两个事件独立时, P ( A ∣ B ) = P ( A ) P(A|B)=P(A) P(AB)=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=1nP(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(AB)P(B)=P(BA)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(BA)=P(A)P(AB)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(BA)=P(A)P(AB)P(B)=i=1nP(ABi)P(AB)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垃圾邮件
1111
2110
3101
4100
5010
6000

假设我们从邮件中提取到了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(B1A): 当特征为 [ 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(B2A): 当特征为 [ 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(B1A) P ( B 2 ∣ A ) P(B_2|A) P(B2A),取概率大的那一类作为分类结果即可。

于是问题变成了:
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(B1A),P(B2A))(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(B1A),P(B2A))=argmaxi(i=12P(ABi)P(AB1)P(B1),i=12P(ABi)P(AB2)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(AB1)P(B1),P(AB2)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(AB1)=P(A1=1,A2=0,...,An=0B1)=P(A1=1B1)P(A2=0B1)...P(An=0B1)=i=1nP(Ai=1 or 0B1)(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=1nP(Ai=1 or 0B1),i=1nP(Ai=1 or 0B2))

怎么求解 P ( A 1 = 1 ∣ B 1 ) P(A_1=1 |B_1) P(A1=1B1)
在训练集中过滤出所有是垃圾邮件的数据,计数为 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=1B1)=mn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值