【手撕】朴素贝叶斯算法

问:朴素贝叶斯是咋分类的呢?

答:通过先验概率和条件概率学习数据上的概率分布,接着计算后验概率得到分类结果。

先验概率:某类存在的概率。

条件概率:某类存在的条件下,取得该数据的概率。

概率分布:数据及上所有类出现概率以及所有类的条件概率。

后验概率:通俗理解的公式就是:后验概率=先验*条件/全概率 = 某类概率 * 某类条件下出现x的概率/全概率。

学习得出概率分布也是朴素贝叶斯的一个重要特征,即它是生成模型的一种。区分生成模型和判定模型的一般标准也是看它最终需要用整个概率分布呢,还是只用条件概率呢。

一、朴素贝叶斯公式推导

1、学习过程——概率分布P(X,Y)

先验概率: P(Y=Ck),k=1,2,...,KP(Y=C_k) ,k=1,2,...,K

C表示类别,k表示第几类。

条件概率: P(X=xY=Ck)=P(X1=x1,X2=x2,...,Xn=xnY=Ck)P(X=x|Y=C_k)=P(X^{1}=x^{1},X^{2}=x^{2},...,X^{n}=x^{n}|Y=C_k)

即当第k类出现的时候,数据向量x出现的概率,可见x共有n个特征。

最终可以通过先验概率和条件概率学习得出联合概率分布P(X,Y)。

2、分类判断——后验概率

首先朴素贝叶斯有两个假设:①所有特征同等重要;②所有特征相互独立。所以条件概率可以改为: P(X=xY=Ck)=j=1nP(Xi=xiY=Ck)P(X=x|Y=C_k)=\prod_{j=1}^{n}P(X^{i}=x^{i}|Y=C_k) 。这样在得到概率分布后可以求得后验概率:

P(Y=CkX=x)=P(Y=Ck)P(X=xY=Ck)kP(X=xY=Ck)P(Y=Ck)P(Y=C_k|X=x)=\frac{P(Y=C_k)*P(X=x|Y=C_k)}{\sum _k P(X=x|Y=C_k)*P(Y=C_k)}

=P(Y=Ck)jP(Xj=xjY=Ck)kP(Y=Ck)jP(Xj=xjY=Ck)= \frac{P(Y=C_k)*\prod _j P(X^j=x^j|Y=C_k)}{\sum _k P(Y=C_k) \prod _j P(X^j=x^j|Y=C_k)}

分子是第k类的先验与条件概率的乘积,分母是所有类别的得先验与条件概率的乘积,由此计算出的是数据x属于第k类的概率。

挑选出最大的后验概率,那么对应的类别就判断为新样本的类别。又因为分母对所有数据都一样,所最大先验和条件概率的乘积所对应的类别为新数据的类别。即:

y=argmaxCkP(Y=Ck)jP(Xj=xjY=Ck)y=argmax _{C_k} P(Y=C_k)*\prod _j P(X^j=x^j|Y=C_k)

3、参数估计——最大似然法

前面讲只要知道先验概率和条件概率就就可以计算后验概率来判断类别了,那么在拿到数据后如何计算先验概率和条件概率呢?方法就是最大似然估计法。

估计先验概率: P(Y=Ck)=i=1NI(yi=Ck)NP(Y=C_k)=\frac{\sum_{i=1}^{N}I(y_i=C_k)}{N}

表示第k类个体所占总体比例。

估计条件概率: P(XjY=Ck)=i=1NI(xij=ail,yi=Ck)I(yi=Ck)P(X^j|Y=C_k)=\frac{\sum_{i=1}^{N}I(x^j_i=a_{il},y_i=C_k)}{I(y_i=C_k)}

表示第k类中,特征j取得l的个体占k类样本总体的概率。其中 I(x)I(x) 表示指示函数,j表示第j个特征,l表示第j个特征的第l种取值,如西瓜的表皮颜色这个特征j,那绿色就是一种取值l,乌黑色又是另一种取值。

举个例子

某个医院早上收了六个门诊病人,如下表。
【手撕】朴素贝叶斯算法
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上哪种病概率最大?

(1)计算先验概率

共有6个历史数据(训练集),3种疾病(类别)

P(Y=感冒)=3/6;P(Y=过敏)=1/6;P(Y=脑震荡)=2/6;

(2)计算条件概率

共有2个特征,分别是症状和职业。别忘了特征同等重要且相互独立。

P(症状=打喷嚏,职业=护士|Y=感冒)=P(症状=打喷嚏|Y=感冒)* P(职业=护士|Y=感冒)=2/3 * 1/3 = 2/9

即P(症状=打喷嚏,职业=护士|Y=感冒)=2/9,同理可得:

P(症状=打喷嚏,职业=农夫|Y=感冒)=0

P(症状=打喷嚏,职业=建筑工人|Y=感冒)=2/9

P(症状=打喷嚏,职业=教师|Y=感冒)=2/9

P(症状=头痛,职业=护士|Y=感冒)=1/9

P(症状=头痛,职业=农夫|Y=感冒)=0

P(症状=头痛,职业=建筑工人|Y=感冒)=1/9

P(症状=头痛,职业=教师|Y=感冒)=1/9

P(症状=打喷嚏,职业=护士|Y=过敏)=0

P(症状=打喷嚏,职业=农夫|Y=过敏)=1。其他过敏情况下的可能性为0,因为过敏情况进一条数据。

P(症状=头痛,职业=建筑工人|Y=脑震荡)=1/2

P(症状=头痛,职业=教师|Y=脑震荡)=1/2

(3)计算最大后验概率

P(Y=感冒 | 症状=打喷嚏,职业=建筑工人)=P(Y=感冒) * P(症状=打喷嚏,职业=建筑工人|Y=感冒)=1/2 * 2/9 = 1/9 (这里不是指感冒的概率,感冒的概率还得除以全概率的分母)

P(Y=过敏 | 症状=打喷嚏,职业=建筑工人)=P(Y=过敏 ) * P(症状=打喷嚏,职业=建筑工人|Y=过敏)=1/6 * 0 = 0

P(Y=脑震荡 | 症状=打喷嚏,职业=建筑工人)=P(Y=脑震荡 ) * P(症状=打喷嚏,职业=建筑工人|Y=脑震荡 )=2/6 * 0 = 0

所以根据最大后验概率判断一个打喷嚏的建筑工人最可能患感冒这种症状。

如有错误欢迎批评指正,谢谢。

如果您觉得有用,欢迎关注公众号“慢慢学算法”
【手撕】朴素贝叶斯算法