朴素贝叶斯是经典的机器学习算法之一,同时也是为数不多的基于概率论的分类算法。不过朴素贝叶斯算法相对而言,还是很简单,很容易理解的。用一句话概括理解就是:通过已知数据判定未知数据的一个概率问题,多用于文本分类,比如垃圾邮件过滤等。
本篇主要从以下几方面来总结:
- 基本概念
- 基于前提
- 三种实现方式
- 优化改进
- 延伸
宏观见如下思维导图:
一、基本概念:
1、定义
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
2、“朴素”的含义
各样本特征间相互独立;
就比如体重和身高是有直接关系的,但是我们在这里就可以很天真的假设两者是没有任何关系的。朴素其实就是各样本特征间保持相互独立。
二、基于前提
1、贝叶斯公式
根据如上可爱的图,我们可以得到很多有用信息
P ( B ∣ A ) = P ( A ∩ B ) P ( A ) P(B|A)=\frac{P(A∩B)}{P(A)} P(B∣A)=P(A)P(A∩B) 在A发生的条件下,B发生的概率(A∩B的部分)
P ( A ∣ B ) = P ( A ∩ B ) P ( B ) P(A|B)=\frac{P(A∩B)}{P(B)} P(A∣B)=P(B)P(A∩B) 在B发生的条件下,A发生的概率(A∩B的部分)
推断可得到:(贝叶斯公式)
P ( B ∣ A ) = P ( A ∣ B ) ∗ P ( B ) P ( A ) P(B|A)=\frac{P(A|B)*P(B)}{P(A)} P(B∣A)=P(A)P(A∣B)∗P(B)
P ( A ∣ B ) = P ( B ∣ A ) ∗ P ( A ) P ( B ) P(A|B)=\frac{P(B|A)*P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)∗P(A)
- 先验概率:P(A), P(B)
- 条件概率:P(A|B) ,P(B|A)
2、相互独立
独立的定义有多种表达方式。在讨论概率问题时,独立性是一种重要的基础概念。常用的几种表达如下:
- A与B独立
- (条件概率与条件无关)P(A|B)=P(A|非B)
- (添加或去除条件不受影响)P(A|B)=P(A)
- (联和概率之比相同)P(B|A):P(B|非A)=P(非B,A):P(非B,非A)
- ※(联和概率是边缘概率的乘积)P(B,A)=P(B)P(A)
我们可以举一个很简单明了的例子,见如下表格:
– | Y=松 | Y=竹 | Y=梅 |
---|---|---|---|
X=优 | 1 48 \frac{1}{48} 481 | 2 48 \frac{2}{48} 482 | 3 48 \frac{3}{48} 483 |
X=良 | 2 48 \frac{2}{48} 482 | 4 48 \frac{4}{48} 484 | 6 48 \frac{6}{48} 486 |
X=中 | 5 48 \frac{5}{48} 485 | 10 48 \frac{10}{48} 4810 | 15 48 \frac{15}{48} 4815 |
X 与Y是否相互独立?
优:
1
48
\frac{1}{48}
481 :
2
48
\frac{2}{48}
482:
3
48
\frac{3}{48}
483=1:2:3
良: 2 48 \frac{2}{48} 482 : 4 48 \frac{4}{48} 484: 6 48 \frac{6}{48} 486=1:2:3
中: 5 48 \frac{5}{48} 485 : 10 48 \frac{10}{48} 4810: 15 48 \frac{15}{48} 4815=1:2:3
根据第4种表达方式,联合概率之比相同,松竹梅之间的比例和优良中是毫无关系的。这种比值的方式是最能直接了当看明白的。但是方式5是最能体现相互独立的,计算流程如下:
P(松,优)= 1 48 \frac{1}{48} 481
P(松)= 1 48 \frac{1}{48} 481+ 2 48 \frac{2}{48} 482+ 5 48 \frac{5}{48} 485= 8 48 \frac{8}{48} 488
P(优)= 1 48 \frac{1}{48} 481+ 2 48 \frac{2}{48} 482+ 3 48 \frac{3}{48} 483= 6 48 \frac{6}{48} 486
P(松)P(优)= 8 48 \frac{8}{48} 488 6 48 \frac{6}{48} 486= 1 48 \frac{1}{48} 481 满足P(松,优)=P(松)*P(优)
P(松,良)= 2 48 \frac{2}{48} 482
P(良)= 2 48 \frac{2}{48} 482+ 4 48 \frac{4}{48} 484+ 6 48 \frac{6}{48} 486= 12 48 \frac{12}{48} 4812
P(松)P(良)= 8 48 \frac{8}{48} 488 12 48 \frac{12}{48} 4812= 2 48 \frac{2}{48} 482 满足P(松,良)=P(松)*P(良)
P(松,中)= 5 48 \frac{5}{48} 485
P(中)= 5 48 \frac{5}{48} 485+ 10 48 \frac{10}{48} 4810+ 15 48 \frac{15}{48} 4815= 30 48 \frac{30}{48} 4830
P(松)P(中)= 8 48 \frac{8}{48} 488 30 48 \frac{30}{48} 4830= 5 48 \frac{5}{48} 485 满足P(松,中)=P(松)*P(中)
同理:
P(竹,优)=P(竹)*P(优)
P(竹,良)=P(竹)*P(良)
P(竹,中)=P(竹)*P(中)
P(梅,优)=P(梅)*P(优)
P(梅,良)=P(梅)*P(良)
P(梅,中)=P(梅)*P(中)
看到以上计算流程,发现若是人工计算的话,居然还挺麻烦。但是最后一条便于计算,也是很合理的。(详细可参考 《程序员的数学-概率论》)
三、三种常用模型
(2019年06月17日14:59:49-后期博客详细说明)
- 基于伯努利模型,即先验为伯努利分布的朴素贝叶斯
- 基于多项式模型,即先验为多项式分布的朴素贝叶斯
- 基于高斯模型,即先验为高斯分布的朴素贝叶斯
四、公式
从一个很简单的下例子入手,然后理解公式。
挂科了(Y) | 玩游戏(X1) | 喝酒(X2) | 学习(X3) |
---|---|---|---|
1 | 1 | 1 | 0 |
0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 |
1 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 |
问题:我们来判定一个人,没有玩游戏,没有喝酒,还学习了,挂科的概率?
通过如上的表格,我们可以得到如下的基本概率:
挂科了的概率: P ( Y = 1 ) = 4 8 P(Y=1)=\frac{4}{8} P(Y=1)=84
不挂科的概率: P ( Y = 0 ) = 4 8 P(Y=0)=\frac{4}{8} P(Y=0)=84
玩游戏的概率: P ( X 1 = 1 ) = 3 8 P(X1=1)=\frac{3}{8} P(X1=1)=83
不玩游戏的概率: P ( X 1 = 0 ) = 5 8 P(X1=0)=\frac{5}{8} P(X1=0)=85
喝酒了的概率: P ( X 2 = 1 ) = 4 8 P(X2=1)=\frac{4}{8} P(X2=1)=84
没喝酒的概率: P ( X 2 = 0 ) = 4 8 P(X2=0)=\frac{4}{8} P(X2=0)=84
学习了的概率: P ( X 3 = 1 ) = 5 8 P(X3=1)=\frac{5}{8} P(X3=1)=85
没学习的概率: P ( X 3 = 0 ) = 3 8 P(X3=0)=\frac{3}{8} P(X3=0)=83
玩游戏了且挂科的概率: P ( Y ∩ X 1 ) = 2 8 P(Y \cap X1)=\frac{2}{8} P(Y∩X1)=82
喝酒了且挂科的概率: P ( Y ∩ X 2 ) = 2 8 P(Y \cap X2)=\frac{2}{8} P(Y∩X2)=82
学习了且挂科的概率: P ( Y ∩ X 3 ) = 2 8 P(Y \cap X3)=\frac{2}{8} P(Y∩X3)=82
条件概率:玩游戏了且挂科的概率: P ( Y ∣ X 1 ) = P ( Y ∩ X 1 ) P ( X 1 ) = 2 3 P(Y|X1)=\frac{P(Y \cap X1)}{P(X1)}=\frac{2}{3} P(Y∣X1)=P(X1)P(Y∩X1)=32
喝酒了且挂科的概率: P ( Y ∣ X 2 ) = P ( Y ∩ X 2 ) P ( X 2 ) = 1 2 P(Y|X2)=\frac{P(Y \cap X2)}{P(X2)}=\frac{1}{2} P(Y∣X2)=P(X2)P(Y∩X2)=21
学习了且挂科的概率: P ( Y ∣ X 3 ) = P ( Y ∩ X 3 ) P ( X 3 ) = 2 5 P(Y|X3)=\frac{P(Y \cap X3)}{P(X3)}=\frac{2}{5} P(Y∣X3)=P(X3)P(Y∩X3)=52
对于贝叶斯推论,由于上边已经证明,所以这边不多做描述。
我们可以通过X1举例得到一个贝叶斯公式:
P ( Y ∣ X 1 ) = P ( X 1 ∣ Y ) P ( Y ) P ( X 1 ) P(Y|X1)=\frac{P(X1|Y)P(Y)}{P(X1)} P(Y∣X1)=P(X1)P(X1∣Y)P(Y)
我们此刻重写贝叶斯准则,其不仅仅与X1有关,而且与X2,X3都有关。
把X1替换成X1,X2,X3,即
P ( Y ∣ X 1 , X 2 , X 3 ) = P ( X 1 , X 2 , X 3 ∣ Y ) P ( Y ) P ( X 1 , X 2 , X 3 ) P(Y|X1,X2,X3)=\frac{P(X1,X2,X3|Y)P(Y)}{P(X1,X2,X3)} P(Y∣X1,X2,X3)=P(X1,X2,X3)P(X1,X2,X3∣Y)P(Y)
X1,X2,X3之间是相互独立的,在朴素贝叶斯中,假设所有条件都是相互独立的,该假设也称作条件独立性假设,
意味着可以使用P(X1|Y)P(X2|Y)P(X3|Y)来计算 P(X1,X2,X3|Y)P(Y),也就是说
P(X1,X2,X3|Y)P(Y)≈P(X1|Y)P(X2|Y)P(X3|Y)
其中 P ( X 1 ∣ Y ) = P ( Y ∣ X 1 ) P ( Y ) P ( X 1 ) P(X1|Y)=\frac{P(Y|X1)P(Y)}{P(X1)} P(X1∣Y)=P(X1)P(Y∣X1)P(Y)
P ( X 2 ∣ Y ) = P ( Y ∣ X 2 ) P ( Y ) P ( X 2 ) P(X2|Y)=\frac{P(Y|X2)P(Y)}{P(X2)} P(X2∣Y)=P(X2)P(Y∣X2)P(Y)
P ( X 3 ∣ Y ) = P ( Y ∣ X 3 ) P ( Y ) P ( X 3 ) P(X3|Y)=\frac{P(Y|X3)P(Y)}{P(X3)} P(X3∣Y)=P(X3)P(Y∣X3)P(Y)
所以P(Y|X1,X2,X3)≈P(X1|Y)P(X2|Y)P(X3|Y)P(Y),在此忽略了P(X1,X2,X3)
最终需要的问题是求:没有玩游戏,么有喝酒,还学习了,挂科的概率是多少。
P(Y=0|X1=0,X2=0,X3=1)= 5 28 \frac{5}{28} 285
将如上的X1,X2,X3换成W,W为一个向量,即它由多个数值组成,这就是我们的朴素贝叶斯公式
P ( Y ∣ W ) = P ( W ∣ Y ) P ( Y ) P ( W ) P(Y|W)=\frac{P(W|Y)P(Y)}{P(W)} P(Y∣W)=P(W)P(W∣Y)P(Y)
五、优化方式
1、拉普拉斯平滑
比如上边的挂科的例子,我们来计算没玩游戏,没喝酒,还学习了挂科与不挂科的概率
P(Y=0|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)= 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21* 1 2 \frac{1}{2} 21= 1 16 \frac{1}{16} 161
P(Y=1|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)= 3 4 \frac{3}{4} 43 1 2 \frac{1}{2} 21 3 4 \frac{3}{4} 43* 1 2 \frac{1}{2} 21= 9 64 \frac{9}{64} 649
所以通过以上概率,我们可以分析得到,若不玩游戏,不喝酒,还学习了,不挂科的概率比较大。
但是用极大似然估计法,有可能会出现所要估计的概率值为0的情况,这会影响后验概率的计算结果。这种情况我们则引入贝叶斯估计的情况,也就是专业术语,拉普拉斯平滑,加入一个参数λ,进行调和,来避免0的情况的发生。当λ=1的时候,就是拉普拉苏平滑;当λ=0的时候,也就是极大似然估计。
其中K就是表示有几种类别,我们都知道朴素贝叶斯算法是适用于标称型数据的,也就是只存在是和否两种情况,挂科与否的例子,我们用了1和0两种,所以K=2.加入λ的取值,我们计算的结果如下:
P ( Y = 1 ) = 4 + 1 8 + 2 = 5 10 P(Y=1)=\frac{4+1}{8+2}=\frac{5}{10} P(Y=1)=8+24+1=105
P ( Y = 0 ) = 4 + 1 8 + 2 = 5 10 P(Y=0)=\frac{4+1}{8+2}=\frac{5}{10} P(Y=0)=8+24+1=105
P(Y=0|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)= 1 + 1 2 + 2 \frac{1+1}{2+2} 2+21+1 1 + 1 2 + 2 \frac{1+1}{2+2} 2+21+1 1 + 1 2 + 2 \frac{1+1}{2+2} 2+21+1* 5 10 \frac{5}{10} 105= 1 16 \frac{1}{16} 161
P(Y=1|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)= 3 + 1 4 + 2 \frac{3+1}{4+2} 4+23+1 1 + 1 2 + 2 \frac{1+1}{2+2} 2+21+1 3 + 1 4 + 2 \frac{3+1}{4+2} 4+23+1* 5 10 \frac{5}{10} 105= 1 9 \frac{1}{9} 91
计算结果是不一样的。
2、条件概率对数化
另一个遇到的问题则是下溢出,就依旧取值上述的例子,当P(X1|Y)P(X2|Y)P(X3|Y)太小时,当用python语言计算的时候会出现下溢出或者得不到正确的答案,这时候我们则可以通过取对数的方式来解决出错的问题。(在手动计算是没有问题的)
由上边的图我们可以了解到,f(x)与In(f(x))在相同的区域内会同时增加或者减少,并且在相同点上取到极值,取值虽然不同,但是由于朴素贝叶斯是一种分类的算法,所以并不影响最后的结果。
六、延伸 贝叶斯网络
朴素贝叶斯是基于各特征之间相互独立的,直接计算条件概率进行分类,是最简单的一种贝叶斯算法。而实际情况下,各特征独立这个条件是难以满足的,此时需要使用贝叶斯网络进行分类。本篇不多做介绍,后期学习。