探究算法细节,深入了解算法原理
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(c1∣x,y),p(c2∣x,y),...,p(cn∣x,y)]
问题转换成如何求 p ( c i ∣ x , y ) p(c_i|x,y) p(ci∣x,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(Y∣X)=P(X)P(X,Y)
P ( X ∣ Y ) = P ( X , Y ) P ( Y ) P(X|Y)=\frac{P(X,Y)}{P(Y)} P(X∣Y)=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(Y∣X)=P(X)P(X∣Y)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)=k∑P(X∣Y=Yk)P(Yk)
∑ k P ( Y k ) = 1 \sum_{k} P\left(Y_{k}\right)=1 k∑P(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(Yk∣X)=∑kP(X∣Y=Yk)P(Yk)P(X∣Yk)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)=argckmax∑kP(Y=ck)∏j=1nP(Xj=ajl∣Y=ck)P(Y=ck)∏j=1nP(Xj=ajl∣Y=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=1∏nP(Xj=ajl∣Y=ck)
2. 朴素贝叶斯实例
![](https://img-blog.csdnimg.cn/20190507210537519.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hbGVsZTR0aA==,size_16,color_FFFFFF,t_70)
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∗(63∗61∗61∗61)=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∗(62∗63∗66∗64)=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=1∏nP(Xj=ajl∣Y=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=ajl∣Y=ck)=∑i=1mI(y(i)=ck)+K∑i=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+1∗6+20+1∗6+25+1∗6+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+1∗6+20+1∗6+20+1∗6+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文档