朴素贝叶斯是经典的机器学习算法之一,同时也是为数不多的基于概率论的分类算法。不过朴素贝叶斯算法相对而言,还是很简单,很容易理解的。用一句话概括理解就是:通过已知数据判定未知数据的一个概率问题,多用于文本分类,比如垃圾邮件过滤等。
本篇主要从以下几方面来总结:
- 基本概念
- 基于前提
- 三种实现方式
- 优化改进
- 延伸
宏观见如下思维导图:
一、基本概念:
1、定义
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
2、“朴素”的含义
各样本特征间相互独立;
就比如体重和身高是有直接关系的,但是我们在这里就可以很天真的假设两者是没有任何关系的。朴素其实就是各样本特征间保持相互独立。
二、基于前提
1、贝叶斯公式
根据如上可爱的图,我们可以得到很多有用信息
在A发生的条件下,B发生的概率(A∩B的部分)
在B发生的条件下,A发生的概率(A∩B的部分)
推断可得到:(贝叶斯公式)
- 先验概率: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=优 | |||
X=良 | |||
X=中 |
X 与Y是否相互独立?
优: ::=1:2:3
良: ::=1:2:3
中: ::=1:2:3
根据第4种表达方式,联合概率之比相同,松竹梅之间的比例和优良中是毫无关系的。这种比值的方式是最能直接了当看明白的。但是方式5是最能体现相互独立的,计算流程如下:
P(松,优)=
P(松)=++=
P(优)=++=
P(松)P(优)== 满足P(松,优)=P(松)*P(优)
P(松,良)=
P(良)=++=
P(松)P(良)== 满足P(松,良)=P(松)*P(良)
P(松,中)=
P(中)=++=
P(松)P(中)== 满足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 |
问题:我们来判定一个人,没有玩游戏,没有喝酒,还学习了,挂科的概率?
通过如上的表格,我们可以得到如下的基本概率:
挂科了的概率:
不挂科的概率:
玩游戏的概率:
不玩游戏的概率:
喝酒了的概率:
没喝酒的概率:
学习了的概率:
没学习的概率:
玩游戏了且挂科的概率:
喝酒了且挂科的概率:
学习了且挂科的概率:
条件概率:玩游戏了且挂科的概率:
喝酒了且挂科的概率:
学习了且挂科的概率:
对于贝叶斯推论,由于上边已经证明,所以这边不多做描述。
我们可以通过X1举例得到一个贝叶斯公式:
我们此刻重写贝叶斯准则,其不仅仅与X1有关,而且与X2,X3都有关。
把X1替换成X1,X2,X3,即
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(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)=
将如上的X1,X2,X3换成W,W为一个向量,即它由多个数值组成,这就是我们的朴素贝叶斯公式
五、优化方式
1、拉普拉斯平滑
比如上边的挂科的例子,我们来计算没玩游戏,没喝酒,还学习了挂科与不挂科的概率
P(Y=0|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
P(Y=1|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
所以通过以上概率,我们可以分析得到,若不玩游戏,不喝酒,还学习了,不挂科的概率比较大。
但是用极大似然估计法,有可能会出现所要估计的概率值为0的情况,这会影响后验概率的计算结果。这种情况我们则引入贝叶斯估计的情况,也就是专业术语,拉普拉斯平滑,加入一个参数λ,进行调和,来避免0的情况的发生。当λ=1的时候,就是拉普拉苏平滑;当λ=0的时候,也就是极大似然估计。
其中K就是表示有几种类别,我们都知道朴素贝叶斯算法是适用于标称型数据的,也就是只存在是和否两种情况,挂科与否的例子,我们用了1和0两种,所以K=2.加入λ的取值,我们计算的结果如下:
P(Y=0|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
P(Y=1|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
计算结果是不一样的。
2、条件概率对数化
另一个遇到的问题则是下溢出,就依旧取值上述的例子,当P(X1|Y)P(X2|Y)P(X3|Y)太小时,当用python语言计算的时候会出现下溢出或者得不到正确的答案,这时候我们则可以通过取对数的方式来解决出错的问题。(在手动计算是没有问题的)
由上边的图我们可以了解到,f(x)与In(f(x))在相同的区域内会同时增加或者减少,并且在相同点上取到极值,取值虽然不同,但是由于朴素贝叶斯是一种分类的算法,所以并不影响最后的结果。
六、延伸 贝叶斯网络
朴素贝叶斯是基于各特征之间相互独立的,直接计算条件概率进行分类,是最简单的一种贝叶斯算法。而实际情况下,各特征独立这个条件是难以满足的,此时需要使用贝叶斯网络进行分类。本篇不多做介绍,后期学习。