ML算法推导细节02—朴素贝叶斯NB

探究算法细节,深入了解算法原理

1. 朴素贝叶斯公式

  • 朴素贝叶斯(Naive Bayes)的"朴素"是假设各个特征之间相互独立
  • 算法简单,计算量小,但损失一定的正确率,常用于文本分类
  • 通过先验概率+数据,得到后验概率,从而确定分类
  • 是一种生成模型,需要找出联合分布P(X,Y),然后求出P(Y|X)=P(X,Y)/P(X)

朴素贝叶斯的核心思想:选择概率最高的一类作为新样本的属类
m a x [ p ( c 1 ∣ x , y ) , p ( c 2 ∣ x , y ) , . . . , p ( c n ∣ x , y ) ] max[p(c_1|x,y),p(c_2|x,y),...,p(c_n|x,y)] max[p(c1x,y),p(c2x,y),...,p(cnx,y)]

问题转换成如何求 p ( c i ∣ x , y ) p(c_i|x,y) p(cix,y)

(1)条件独立公式:
P ( X , Y ) = P ( X ) P ( Y ) P(X,Y)=P(X)P(Y) P(X,Y)=P(X)P(Y)

(2)条件概率公式:
P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X)=\frac{P(X,Y)}{P(X)} P(YX)=P(X)P(X,Y)

P ( X ∣ Y ) = P ( X , Y ) P ( Y ) P(X|Y)=\frac{P(X,Y)}{P(Y)} P(XY)=P(Y)P(X,Y)

P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)} P(YX)=P(X)P(XY)P(Y)

(3)全概率公式:
P ( X ) = ∑ k P ( X ∣ Y = Y k ) P ( Y k ) P(X)=\sum_{k} P\left(X | Y=Y_{k}\right) P\left(Y_{k}\right) P(X)=kP(XY=Yk)P(Yk)

∑ k P ( Y k ) = 1 \sum_{k} P\left(Y_{k}\right)=1 kP(Yk)=1

(4)推导出贝叶斯公式:
P ( Y k ∣ X ) = P ( X ∣ Y k ) P ( Y k ) ∑ k P ( X ∣ Y = Y k ) P ( Y k ) P\left(Y_{k} | X\right)=\frac{P\left(X | Y_{k}\right) P\left(Y_{k}\right)}{\sum_{k} P\left(X | Y=Y_{k}\right) P\left(Y_{k}\right)} P(YkX)=kP(XY=Yk)P(Yk)P(XYk)P(Yk)

(5)贝叶斯分类器表示为:
y = f ( x ) = arg ⁡ max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X j = a j l ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j = 1 n P ( X j = a j l ∣ Y = c k ) y=f(x)=\arg \max _{c_{k}} \frac{P\left(Y=c_{k}\right) \prod_{j=1}^n P\left(X_j=a_{jl} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j=1}^n P\left(X_j=a_{jl} | Y=c_{k}\right)} y=f(x)=argckmaxkP(Y=ck)j=1nP(Xj=ajlY=ck)P(Y=ck)j=1nP(Xj=ajlY=ck)

其中 n n n 表示特征个数, X j X_j Xj 表示样本的第 j j j 个特征, a j l a_{jl} ajl表示第 j j j 个特征的第 l l l个取值。

(6)分母对所有的 c k c_k ck 都是相同的,化简为:
y = arg ⁡ max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X j = a j l ∣ Y = c k ) y=\arg \max _{c_k} P\left(Y=c_{k}\right) \prod_{j=1}^n P(X_j=a_{jl}| Y=c_{k} ) y=argckmaxP(Y=ck)j=1nP(Xj=ajlY=ck)

2. 朴素贝叶斯实例

x=(不帅,性格不好,矮,不上进),则y等于嫁还是不嫁

由于分母相同,只求分子部分

(1)P(嫁|x=不帅,性格不好,矮,不上进)的分子
P ( 嫁 ) ∗ [ P ( 不 帅 ∣ 嫁 ) ∗ P ( 性 格 不 好 ∣ 嫁 ) ∗ P ( 矮 ∣ 嫁 ) ∗ P ( 不 上 进 ∣ 嫁 ) ] P(嫁)*[P(不帅|嫁)*P(性格不好|嫁)*P(矮|嫁)*P(不上进|嫁)] P()[P()P()P()P()]

1 2 ∗ ( 3 6 ∗ 1 6 ∗ 1 6 ∗ 1 6 ) = 1 864 \frac{1}{2}*(\frac{3}{6}*\frac{1}{6}*\frac{1}{6}*\frac{1}{6})=\frac{1}{864} 21(63616161)=8641

(2)P(不嫁|x=不帅,性格不好,矮,不上进)的分子
P ( 不 嫁 ) ∗ [ P ( 不 帅 ∣ 不 嫁 ) ∗ P ( 性 格 不 好 ∣ 不 嫁 ) ∗ P ( 矮 ∣ 不 嫁 ) ∗ P ( 不 上 进 ∣ 不 嫁 ) ] P(不嫁)*[P(不帅|不嫁)*P(性格不好|不嫁)*P(矮|不嫁)*P(不上进|不嫁)] P()[P()P()P()P()]

1 2 ∗ ( 2 6 ∗ 3 6 ∗ 6 6 ∗ 4 6 ) = 1 18 \frac{1}{2}*(\frac{2}{6}*\frac{3}{6}*\frac{6}{6}*\frac{4}{6})=\frac{1}{18} 21(62636664)=181

P(嫁|不帅、性格不好、矮、不上进)=(1/864) / (1/864+1/18)=1/49=2.04%
P(不嫁|不帅、性格不好、矮、不上进)=(1/18) / (1/864+1/18)=48/49=97.96%

3. 拉普拉斯平滑的朴素贝叶斯

3.1 拉普拉斯平滑

  • 朴素贝叶斯存在一个问题,如果在所有样本里,某个特征 xi 没出现过,那么最后的乘积就是0
  • 这个结果对于实际来说不太合理,对于训练样本中没出现过的特征,实际测试有可能出现
  • 所以需要做拉普拉斯平滑,即分子分母同时加上一个数,这样每个特征的条件概率肯定不为0了
  • 一般分子加1,分母加的是类别数

例子:x =(帅,爆好,高,上进)
需要比较分子:

  • P(嫁)*[P(帅|嫁)*P(爆好|嫁)*P(高|嫁)*P(上进|嫁)]
  • P(不嫁)*[P(帅|不嫁)*P(爆好|不嫁)*P(高|不嫁)*P(上进|不嫁)]

数据中没有"性格爆好"这个特点,则 P(性格爆好|嫁)=0,所以 P(嫁|x)=0
并且 P(性格爆好|不嫁)=0,所以 P(不嫁|x)=0,分类器质量下降

3.2 引入拉普拉斯平滑后的公式

y = arg ⁡ max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X j = a j l ∣ Y = c k ) y=\arg \max _{c_k} P\left(Y=c_{k}\right) \prod_{j=1}^n P(X_j=a_{jl}| Y=c_{k} ) y=argckmaxP(Y=ck)j=1nP(Xj=ajlY=ck)

P ( X j = a j l ∣ Y = c k ) = ∑ i = 1 m I ( x j ( i ) = a j l , y ( i ) = c k ) + 1 ∑ i = 1 m I ( y ( i ) = c k ) + K P\left(X_j=a_{j l} | Y=c_{k}\right)=\frac{\sum_{i=1}^{m} I\left(x_{j}^{(i)}=a_{j l},y^{(i)}=c_{k}\right)+1}{\sum_{i=1}^{m} I\left(y^{(i)}=c_{k}\right)+K} P(Xj=ajlY=ck)=i=1mI(y(i)=ck)+Ki=1mI(xj(i)=ajl,y(i)=ck)+1

其中 m m m 表示样本个数, a j l a_{jl} ajl 表示第 j j j 个特征的第 l l l 个取值, K K K 表示类别数。

P ( 嫁 ∣ 帅 , 爆 好 , 高 , 上 进 ) = 6 12 ∗ ( 3 + 1 6 + 2 ∗ 0 + 1 6 + 2 ∗ 5 + 1 6 + 2 ∗ 5 + 1 6 + 2 ) P(嫁|帅,爆好,高,上进)=\frac{6}{12}*(\frac{3+1}{6+2}*\frac{0+1}{6+2}*\frac{5+1}{6+2}*\frac{5+1}{6+2}) P(,,,)=126(6+23+16+20+16+25+16+25+1)

P ( 不 嫁 ∣ 帅 , 爆 好 , 高 , 上 进 ) = 6 12 ∗ ( 4 + 1 6 + 2 ∗ 0 + 1 6 + 2 ∗ 0 + 1 6 + 2 ∗ 2 + 1 6 + 2 ) P(不嫁|帅,爆好,高,上进)=\frac{6}{12}*(\frac{4+1}{6+2}*\frac{0+1}{6+2}*\frac{0+1}{6+2}*\frac{2+1}{6+2}) P(,,,)=126(6+24+16+20+16+20+16+22+1)

P ( 嫁 ∣ x ) / P ( 不 嫁 ∣ x ) = 9.6 P(嫁|x)/P(不嫁|x)=9.6 P(x)/P(x)=9.6

4. sklearn.naive_bayes

在scikit-learn中,共有3种常用的朴素贝叶斯分类器,GaussianNB,MultinomialNB,BernoulliNB。

  • GaussianNB,先验为高斯分布,适用于样本特征大部分是连续值
  • MultinomialNB,先验为多项式分布,适用于样本特征大部分是多元离散值
  • BernoulliNB,先验为伯努利分布,适用于样本特征大部分是二元离散值,或者稀疏的多元离散值
class sklearn.naive_bayes.GaussianNB(priors=None, var_smoothing=1e-09)
# priors:类的先验概率,shape=(n_classes,)
# var_smoothing:用于计算稳定性

class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
# alpha:拉普拉斯平滑参数,默认1.0,0表示无平滑
# fit_prior:是否学习类的先验概率
# class_prior:类的先验概率

class sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
# binarize:样本特征的二值化阈值
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
clf.fit(X, y)
print(clf.predict(x))

参考博客:
1. 朴素贝叶斯算法原理小结
2. 带你彻彻底底搞懂朴素贝叶斯公式
3. 朴素贝叶斯算法 & 应用实例
4. 朴素贝叶斯分类和拉普拉斯平滑
5. 理解朴素贝叶斯算法中的拉普拉斯平滑
6. sklearn naive bayes文档

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值