赞
踩
作为机器学习中少有的生成模型,朴素贝叶斯(Naive Bayes) 是基于统计学中 贝叶斯定理 发展而来的,其中的 朴素(Navie) 二字表明假设数据特征之间均为独立的。它主要应用于 nlp 领域,例如文本分类,情感分析,语法纠错,语言模型等。我们则以传统分类算法进行展开。
在细致地了解朴素贝叶斯前回顾一些简单的概率统计知识,能有效帮助我们推导朴素贝叶斯。
假设有一种数据有两个特征
A
A
A,
B
B
B
不管两者是否独立,我们都可以写出联合概率与条件概率之间的关系,为
P
(
A
,
B
)
=
P
(
A
∣
B
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
P(A,B)=P(A|B)P(B)=P(B|A)P(A)
P(A,B)=P(A∣B)P(B)=P(B∣A)P(A)
联合概率 P ( A , B ) P(A,B) P(A,B) 可以理解为数据中既符合特征 A A A,又符合特征 B B B的数据占比。
假设我们想求得联合概率 P ( A , B ) P(A,B) P(A,B),应该怎么办呢,可以试着从先求得数据中符合特征 A A A 的占比,然后 A A A 的条件基础之上求得符合特征 B B B 的占比。据此思路就是求得 P ( A ) P ( B ∣ A ) P(A)P(B|A) P(A)P(B∣A)。当然我们也可以从特征 B B B 的角度出发,同理得到 P ( B ) P ( A ∣ B ) P(B)P(A|B) P(B)P(A∣B)。
如果特征
A
,
B
A,B
A,B 之间是独立的,我们还可以有
P
(
A
,
B
)
=
P
(
A
)
P
(
B
)
P(A,B)=P(A)P(B)
P(A,B)=P(A)P(B)
基于上面所推得的联合概率与条件概率公式
P
(
A
,
B
)
=
P
(
A
∣
B
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
P(A,B)=P(A|B)P(B)=P(B|A)P(A)
P(A,B)=P(A∣B)P(B)=P(B∣A)P(A)
假设我们数据集含特征X,标签Y,同样有
P
(
Y
∣
X
)
P
(
X
)
=
P
(
X
∣
Y
)
P
(
Y
)
P(Y|X)P(X)=P(X|Y)P(Y)
P(Y∣X)P(X)=P(X∣Y)P(Y)
经过简单的变换可以得到著名的贝叶斯定理,为
P
(
Y
∣
X
)
=
P
(
X
∣
Y
)
P
(
Y
)
P
(
X
)
P(Y|X)=\cfrac{P(X|Y)P(Y)}{P(X)}
P(Y∣X)=P(X)P(X∣Y)P(Y)
其中的 P ( Y ) , P ( X ) P(Y),P(X) P(Y),P(X) 为特征 X X X,与标签 Y Y Y 的 先验概率(边缘概率),先验概率指的是某件事情发生或存在的概率。比如 P ( Y ) P(Y) P(Y),表明所有数据中标签符合 Y Y Y 的概率,是可以通过检查数据集中的标签提前得到的,对特征 X X X 同理。
其中 P ( Y ∣ X ) , P ( X ∣ Y ) P(Y|X),P(X|Y) P(Y∣X),P(X∣Y) 为 后验概率(条件概率),指的是另一件事在某个条件下发生或存在的概率,也可以理解为在某件事已经发生或存在的前提下,另一件事情发生的概率。对于 P ( Y ∣ X ) P(Y|X) P(Y∣X),表明在已知特征X的前提下,求得它符合特定标签Y的概率。
假设存在一个数据集,有n个特征,序列为{
x
1
,
x
2
.
.
.
x
n
x_1,x_2...x_n
x1,x2...xn},m个类别,序列为{
y
1
,
y
2
.
.
.
y
m
y_1,y_2...y_m
y1,y2...ym},如果我们要求得某个特定数据
X
j
X_j
Xj 属于类别
y
k
y_k
yk 的概率,根据贝叶斯定理,我们有
P
(
Y
=
y
k
∣
X
=
X
j
)
=
P
(
X
=
X
j
∣
Y
=
y
k
)
P
(
Y
=
y
k
)
P
(
X
=
X
j
)
P(Y=y_k|X=X_j)=\cfrac{P(X=X_j|Y=y_k)P(Y=y_k)}{P(X=X_j)}
P(Y=yk∣X=Xj)=P(X=Xj)P(X=Xj∣Y=yk)P(Y=yk)
细致点可以写为
P
(
y
k
∣
x
1
j
,
x
2
j
.
.
.
x
n
j
)
=
P
(
x
1
j
,
x
2
j
.
.
.
x
n
j
∣
y
i
)
P
(
y
k
)
P
(
x
1
j
,
x
2
j
.
.
.
x
n
j
)
P(y_k|x^j_1,x^j_2...x^j_n)=\cfrac{P(x^j_1,x^j_2...x^j_n|y_i)P(y_k)}{P(x^j_1,x^j_2...x^j_n)}
P(yk∣x1j,x2j...xnj)=P(x1j,x2j...xnj)P(x1j,x2j...xnj∣yi)P(yk)
由于我们算法在原本的贝叶斯定理上增加了 朴素(Navie) 二字,意味着我们假定所有特征之间为独立的(可能你会有疑惑,这种假设不会对我们得算法造成负面影响吗,理论上是有的;但实际使用,影响甚微,还是不错的效;因此可以忽略不计)。如果特征间的独立,根据之前的公式
P
(
A
,
B
)
=
P
(
A
)
P
(
B
)
P(A,B)=P(A)P(B)
P(A,B)=P(A)P(B)
此时对特征
X
i
X_i
Xi,推导公式可以变为
P
(
y
k
∣
x
1
j
,
x
2
j
.
.
.
x
n
j
)
=
P
(
y
k
)
Π
i
=
1
n
P
(
x
i
j
∣
y
k
)
∑
i
=
1
n
P
(
x
i
j
)
P(y_k|x^j_1,x^j_2...x^j_n)=\cfrac{P(y_k)\Pi_{i=1}^nP(x^j_i|y_k)}{\sum_{i=1}^nP(x^j_i)}
P(yk∣x1j,x2j...xnj)=∑i=1nP(xij)P(yk)Πi=1nP(xij∣yk)
到现在,我们就是设法求得其中公式右边各项的值了,其中先验概率 P ( y k ) , P ( x i j ) , P ( x i j ∣ y k ) P(y_k),P(x^j_i),P(x^j_i|y_k) P(yk),P(xij),P(xij∣yk),我们都是可以在得到数据集的时候就可以统计出来。只不过后两者在特征多,样本量大的情况下计算十分耗时。
由于我们希望对数据
X
j
X_j
Xj 输出最可能大的标签
y
m
a
x
y_{max}
ymax,因此对序列{
y
1
,
y
2
.
.
.
y
m
y_1,y_2...y_m
y1,y2...ym}中的每一个元素都要进行计算,最后找到概率最大的那一个,公式为
y
m
a
x
=
arg max
y
k
P
(
y
k
∣
X
j
)
=
arg max
y
k
P
(
X
i
∣
y
k
)
P
(
y
k
)
P
(
X
i
)
y_{max}=\argmax_{y_k}P(y_k|X_j)=\argmax_{y_k}\cfrac{P(X_i|y_k)P(y_k)}{P(X_i)}
ymax=ykargmaxP(yk∣Xj)=ykargmaxP(Xi)P(Xi∣yk)P(yk)
明显对于任意一个类别的计算,其分母都是相同的值,那么公式可简化为
y
m
a
x
=
arg max
y
k
P
(
X
i
∣
y
k
)
P
(
y
k
)
y_{max}=\argmax_{y_k}P(X_i|y_k)P(y_k)
ymax=ykargmaxP(Xi∣yk)P(yk)
如果简单的使用朴素贝叶斯进行计算,影响概率大小的有两项。对于 P ( y k ) P(y_k) P(yk),意味着如果该类别 y k y_k yk 占比越大,我们甚至可以在不看需要判断的数据本身的前提下进行瞎猜;而前者 P ( X i ∣ y k ) P(X_i|y_k) P(Xi∣yk),则是细看类似的样本在特定标签数据中是否存在很多,存在的越多,概率越大。总的来说,朴素贝叶斯算法与人分类数据的方法是十分相似的,只不过我们高级的多,能够提取更加潜在的关系。
朴素贝叶斯的种类有不少,主要根据数据集选择不同的模型,最常见的三种为:高斯(Gaussian),多项式(Multinomial),伯努利(Bernoulli)。其实sklearn 中还涉及到了 Complement Naive Bayes,Categorical Navie Bayes,Out-of-core naive Bayes model fitting,由于比较冷门,只需要有个印象就行。
高斯朴素贝叶斯作为其中最常用的一种模型,用于特征为连续值得模型(原因看公式就能明白)。对于朴素贝叶斯公式中的
P
(
y
k
)
,
P
(
X
∣
y
k
)
P(y_k),P(X|y_k)
P(yk),P(X∣yk),前者依旧按照标签占比决定概率大小,后者则是根据高斯分布公式进行计算,因为我们此时假设特征
X
X
X 序列中的 {
x
1
,
x
2
.
.
.
x
n
x_1,x_2...x_n
x1,x2...xn} 分别在所有标签序 {
y
1
,
y
2
.
.
.
y
m
y_1,y_2...y_m
y1,y2...ym} 都呈现正态分布,计算公式为
P
(
x
i
∣
y
k
)
=
1
2
π
σ
exp
(
−
(
x
i
−
μ
)
2
2
σ
2
)
P(x_i|y_k)=\cfrac{1}{\sqrt{2\pi \sigma}}\exp(-\cfrac{{(x_i-\mu)}^2}{2 {\sigma}^2})
P(xi∣yk)=2πσ
1exp(−2σ2(xi−μ)2)
μ
\mu
μ:为
x
i
x_i
xi 所对应的特征在标签
y
k
y_k
yk 下的均值
σ
\sigma
σ:为
x
i
x_i
xi 所对应的特征在标签
y
k
y_k
yk 下的方差
可以看到计算过程中包括根号与指数,实际代码中这样写进去计算量是很大的,因此我们可以简化公式做些修改,加上对数并去除常数项,但不影响它的增减性,如
P ( x i ∣ y k ) = log 1 σ − ( x i − μ ) 2 2 σ 2 P(x_i|y_k)=\log \cfrac{1}{\sigma}\ -\cfrac{{(x_i-\mu)}^2}{2{\sigma}^2} P(xi∣yk)=logσ1 −2σ2(xi−μ)2
多项式贝叶斯原理比较简单,适用于离散特征并假设特征在类别条件下符合多项式分布,这也意味着许多特征能出现多次。对于
P
(
y
k
)
,
P
(
x
i
∣
y
k
)
P(y_k),P(x_i|y_k)
P(yk),P(xi∣yk),两者的计算都是简单的占比,后者公式为
P
(
x
i
∣
y
k
)
=
N
x
i
N
y
k
P(x_i|y_k)=\cfrac{N_{x_i}}{N_{y_k}}
P(xi∣yk)=NykNxi
N
x
i
N_{x_i}
Nxi:在
y
k
y_k
yk 的条件下,
x
i
x_i
xi 在所对应的特征中出现的频率
N
y
k
N_{y_k}
Nyk:符合
y
k
y_k
yk 的条件下的所有样本数
公式中存在一些不足,比如在做语法分析时,可能我们的
x
i
x_i
xi 在数据中从未出现,此时得到的
P
(
y
k
)
,
P
(
x
i
∣
y
k
)
P(y_k),P(x_i|y_k)
P(yk),P(xi∣yk) 的值为0,然而对于一个多特征的数据集,仅仅因为一个数值为零,后续连乘我们的
P
(
y
k
)
Π
j
=
1
n
P
(
x
j
i
∣
y
k
)
P(y_k)\Pi_{j=1}^nP(x^i_j|y_k)
P(yk)Πj=1nP(xji∣yk) 也为0,怎么看都觉得这公式容错率不够。因此我们加入了 平滑(smooth) 操作,其中的 one-smoothing ,也被称为拉普拉斯平滑,其公式为
P
(
x
i
∣
y
k
)
=
N
x
i
+
α
N
y
k
+
α
n
P(x_i|y_k)=\cfrac{N_{x_i}+\alpha}{N_{y_k}+\alpha n}
P(xi∣yk)=Nyk+αnNxi+α
α
\alpha
α 为正整数,
n
n
n为数据集的大小
当
α
=
1
\alpha=1
α=1 时,为拉普拉斯平滑;其余情况为 K-smoothing
如果以后学习 自然语言处理(nlp) 的话,除了one-smoothing,K-smoothing,还会了解到Interpolation,Good-Turning Smoothing。有兴趣可以稍微查阅一下。
伯努利朴素贝叶斯一般用于特征为十分稀疏的离散值。此时假设某个特征
x
i
x_i
xi 符合伯努利分布,如果数据在该特征处有值(不管它是多少)就记为1;如果数据在该特征无值,则记为0。对于朴素贝叶斯公式中某一个特征有式子
P
(
x
i
∣
y
k
)
=
x
i
P
(
x
i
=
1
∣
y
k
)
+
(
1
−
x
i
)
P
(
x
i
=
0
∣
y
k
)
P(x_i|y_k)=x_iP(x_i=1|y_k)+(1-x_i)P(x_i=0|y_k)
P(xi∣yk)=xiP(xi=1∣yk)+(1−xi)P(xi=0∣yk)
其中的
x
i
=
1
o
r
0
x_i=1\ or\ 0
xi=1 or 0,并且
P
(
x
i
=
0
∣
y
k
)
=
1
−
P
(
x
i
=
1
∣
y
i
)
P(x_i=0|y_k)=1-P(x_i=1|y_i)
P(xi=0∣yk)=1−P(xi=1∣yi),那么我们可以有
P
(
x
i
∣
y
k
)
=
x
i
P
(
x
i
=
1
∣
y
k
)
+
(
1
−
x
i
)
(
1
−
P
(
x
i
=
1
∣
y
i
)
)
P(x_i|y_k)=x_iP(x_i=1|y_k)+(1-x_i)(1-P(x_i=1|y_i))
P(xi∣yk)=xiP(xi=1∣yk)+(1−xi)(1−P(xi=1∣yi))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。