简介
朴素贝叶斯算法仍然是流行的十大挖掘算法之一,也是是文本分析领域最为常用的算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
1. 预备数学知识
1.1 求极值问题
人工智能中札核心的数学环节是求出一个目标函数最小值或最大值。我们高中时学过的将导数设置成0,然后求出极值点,以及用极值点求出最大值或最小值的方法就是其中之一。
例1:求
f
(
x
)
=
x
2
−
2
x
+
3
f(x)=x^2-2x+3
f(x)=x2−2x+3的最小值。
f
′
(
x
)
=
2
x
−
2
=
0
f'(x)=2x-2=0
f′(x)=2x−2=0即可以得到
x
=
1
x=1
x=1,求得最小值为f(1)=-1.
但是,并不一定所有的函数的极值都可以通过设置导数为0的方式求出,有时候需要利用数值计算相关的技术(如梯度下降法,牛顿法)
1.2 拉格朗日乘法项
有些求极值问题,函数会带有一些条件。如下面的例子:
例2:求
f
(
x
,
y
)
=
x
+
y
f(x, y)=x+y
f(x,y)=x+y的最大值,且
x
2
+
y
2
=
1
x^2+y^2=1
x2+y2=1,那这个时候怎么求出最大值呢?
根据拉格朗日乘法项,将限制条件转变到目标函数中,此时问题就变成:
m
a
x
i
m
i
z
e
L
=
x
+
y
+
λ
(
x
2
+
y
2
−
1
)
maximize \,L=x+y+λ(x^2+y^2-1)
maximizeL=x+y+λ(x2+y2−1)
剩下的过程就跟上面类似,设定导数为0,即可以得到以下三个方程:
f
x
′
(
x
,
y
,
λ
)
=
1
+
2
λ
x
=
0
(1)
f'_x(x,y,λ) =1+2λx=0\tag{1}
fx′(x,y,λ)=1+2λx=0(1)
f
y
′
(
x
,
y
,
λ
)
=
1
+
2
λ
y
=
0
(2)
f'_y(x,y,λ)=1+2λy=0\tag{2}
fy′(x,y,λ)=1+2λy=0(2)
f
λ
′
(
x
,
y
,
λ
)
=
x
2
+
y
2
−
1
=
0
(3)
f'_λ(x,y,λ)=x^2+y^2-1=0\tag{3}
fλ′(x,y,λ)=x2+y2−1=0(3)
解完后,得到
λ
1
=
2
2
λ_1=\frac {\sqrt{2}}{2}
λ1=22,
λ
1
=
−
2
2
λ_1=-\frac {\sqrt{2}}{2}
λ1=−22。然后再求得
(
x
=
2
2
,
y
=
2
2
)
(x=\frac {\sqrt{2}}{2},y=\frac {\sqrt{2}}{2})
(x=22,y=22),
(
x
=
−
2
2
,
y
=
−
2
2
)
(x=-\frac {\sqrt{2}}{2},y=-\frac {\sqrt{2}}{2})
(x=−22,y=−22)。把两个解带入到原来函数里并做比较即可得到最优解。
1.3 最大似然估计
最大似然估计时机器学习领域最为常见的用来构建目标函数的方法。它的核心思想时根据观测到的结果来预测其中的未知参数。我们举一个投掷硬币的例子。假设有一枚硬币,他是不均匀的,也就是说出现正面和反面的概率是不同的。假设我们设定这枚硬币出现正面的概率为P(H)=θ,这里的H指的是正面,类似的会有反面。假设我们投掷6次之后得到了以下的结果,而且我们假定每次投掷都是相互独立事件:
D
=
{
H
,
T
,
T
,
H
,
H
,
H
}
D=\{H, T, T, H, H, H\}
D={H,T,T,H,H,H}其中D表示所观测到的所有样本。从这个结果其实谁都可以很容易说出θ,也就是出现正面的概率为
4
6
\frac{4}{6}
64,其实我们在无意识中使用了最大似然估计法。接下来,我们从严谨的角度来定义最大似然下的目标函数。
基于最大似然估计法,我们需要最大化观测到的样本概率,即P(D)。进一步可以写成:
P
(
D
)
=
P
(
H
T
T
H
H
H
)
=
θ
∗
(
1
−
θ
)
∗
(
1
−
θ
)
∗
θ
∗
θ
∗
θ
P(D)=P(HTTHHH)=θ*(1-θ)*(1-θ)*θ*θ*θ
P(D)=P(HTTHHH)=θ∗(1−θ)∗(1−θ)∗θ∗θ∗θ我们的目标是最大化概率值
L
=
θ
∗
(
1
−
θ
)
∗
(
1
−
θ
)
∗
θ
∗
θ
∗
θ
L=θ*(1-θ)*(1-θ)*θ*θ*θ
L=θ∗(1−θ)∗(1−θ)∗θ∗θ∗θ。那这部分的优化既可以采用上面所提到的方法。
L
′
(
θ
)
=
4
θ
3
(
1
−
θ
)
2
−
θ
4
∗
2
∗
(
1
−
θ
)
=
0
L'(θ)=4θ^3(1-θ)^2-θ^4*2*(1-θ)=0
L′(θ)=4θ3(1−θ)2−θ4∗2∗(1−θ)=0把这个式子整理完之后即可得到
θ
=
2
3
θ=\frac {2}{3}
θ=32,结果跟一开始算出来的一致。
2 朴素贝叶斯
2.1 求目标函数
假设给定一批训练数据
D
=
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
D={(x^1,y^1),...,(x^N,y^N)}
D=(x1,y1),...,(xN,yN),其中
x
i
x^i
xi指的是第
i
i
i个样本(句子或文章),而且这个样本(句子或文章)包含了
m
i
m_i
mi个单词,所以
x
i
=
(
x
1
i
,
x
2
i
,
.
.
.
,
x
m
i
i
)
x_i=(x_1^i,x_2^i,...,x_{m_i}^i)
xi=(x1i,x2i,...,xmii),假设x^i的内容为“今天很高兴学习自然语言处理技术”,切分词后为“今天,很,高兴,学习,自然语言处理,技术”,则
x
1
i
x_1^i
x1i=“今天”,
x
2
i
x_2^i
x2i=“很”,
x
3
i
x_3^i
x3i=“高兴”,
x
4
i
x_4^i
x4i=“学习”,
x
5
i
x_5^i
x5i=“自然语言处理”,
x
6
i
x_6^i
x6i=“技术”,
m
i
m_i
mi=6。此外,
y
i
y^i
yi代表
x
i
x^i
xi的标签。比如在垃圾邮件的应用上,它代表“垃圾邮件”或“正常邮件”。我们用K来代表分类的个数。比如在垃圾邮件应用上K=2。但在这里,我们考虑普遍的情况,很有可能K>2,也称之为是多分类问题。最后,我们再设V为词典库的大小。
朴素贝叶斯是生成模型,它的目标函数是要最大化概率P(D),也就是说P(x,y)。(判别模型目标函数为P(y|x))我们把前几步的推导先写下:
P
(
D
)
=
∏
i
=
1
N
P
(
x
i
,
y
i
)
=
∏
i
=
1
N
P
(
x
i
∣
y
i
)
P
(
y
i
)
(4)
P(D)=\prod_{i=1}^N P(x^i, y^i)=\prod_{i=1}^N P(x^i|y^i)P(y^i) \tag{4}
P(D)=i=1∏NP(xi,yi)=i=1∏NP(xi∣yi)P(yi)(4)这里利用贝叶斯公式转化,其中
P
(
x
i
∣
y
i
)
=
P
(
x
i
,
y
i
)
P
(
y
i
)
P(x^i|y^i)=\frac{P(x^i, y^i)}{P(y^i)}
P(xi∣yi)=P(yi)P(xi,yi)
=
∏
i
=
1
n
P
(
x
1
i
,
x
2
i
.
.
.
x
m
i
∣
y
i
)
P
(
y
i
)
(5)
\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad=\prod_{i=1}^n P(x_1^i,x_2^i...x_m^i|y^i)P(y^i) \tag{5}
=i=1∏nP(x1i,x2i...xmi∣yi)P(yi)(5)式子(4)到(5)的变化是利用利用事实,样本
x
i
x^i
xi由多个单词组成,每个
x
j
i
x_j^i
xji看做一个单词。
=
∏
i
=
1
N
∏
j
=
1
m
i
P
(
x
j
i
∣
y
i
)
P
(
y
i
)
(6)
\,\quad\quad\quad\quad\quad\quad\quad\quad\quad=\prod_{i=1}^N \prod_{j=1}^{m^i}P(x^i_j|y^i)P(y^i) \tag{6}
=i=1∏Nj=1∏miP(xji∣yi)P(yi)(6)式子(5)到(6)是利用了朴素贝叶斯的独立性假设,也就是说每个单词是相互独立的。比如给定一个句子“我们今天运功”,在给定一个标签y的情况下,概率可以写成P(“我们今天运动”|y)=P(“我们”|y)∗P(“今天”|y)*P(“运动”|y)。
为了减缓多个乘法项下出现overflow或un
derflow的问题发生,我们需要将公式两边转化为log形式,因为log函数是严格单调递增的函数,不影响我们对结果的比较。加上log后的形式如下:
P
(
D
)
=
l
o
g
(
∏
i
=
1
N
∏
j
=
1
m
i
P
(
x
j
i
∣
y
i
)
P
(
y
i
)
)
(7)
P(D)=log(\prod_{i=1}^N \prod_{j=1}^{m^i}P(x^i_j|y^i)P(y^i) \tag{7})
P(D)=log(i=1∏Nj=1∏miP(xji∣yi)P(yi))(7)
=
l
o
g
(
∏
i
=
1
N
∏
j
=
1
V
P
(
w
j
i
∣
y
i
)
n
i
j
P
(
y
i
)
)
(8)
\,\quad\quad\quad\quad=log(\prod_{i=1}^N \prod_{j=1}^{V}P(w^i_j|y^i)^{n_{ij}}P(y^i) \tag{8})
=log(i=1∏Nj=1∏VP(wji∣yi)nijP(yi))(8)公式(7)到(8)是利用了一些技巧。举例子,假设一个文章内容为“我们 天 天 运动”,按照之前的逻辑这句话的概率为P(“我们天天运动”|y)=P(“我们”|y)P(“天”|y)P(“天”|y)P(“运动”|y)。但另一方面,也可以利用词典库的所有词来代表这个概率。
P
(
"
我
们
天
天
运
动
"
∣
y
)
=
P
(
"
啊
"
∣
y
)
0
P
(
"
哎
"
∣
y
)
0
.
.
.
P
(
"
天
"
∣
y
)
2
.
.
.
P
(
"
我
们
"
∣
y
)
1
.
.
.
P
(
“
运
动
”
∣
y
)
1
.
.
.
P("我们天天运动"|y)=P("啊"|y)^0P("哎"|y)^0...P("天"|y)^2...P("我们"|y)^1...P(“运动”|y)^1...
P("我们天天运动"∣y)=P("啊"∣y)0P("哎"∣y)0...P("天"∣y)2...P("我们"∣y)1...P(“运动”∣y)1...,这两者是等价的,因为没有出现在句子中的词,只不过我们从词典库的角度把所有单词都考虑进来,并数下每个单词在文档i里出现的次数。如果没有出现,相当于0次,0次幂等于1,不影响惩罚项。所以从这个角度我们可以把
∏
j
=
1
m
i
P
(
x
j
i
∣
y
i
)
\prod_{j=1}^{m^i}P(x^i_j|y^i)
∏j=1miP(xji∣yi)写成
∏
j
=
1
V
P
(
w
j
i
∣
y
i
)
n
i
j
\prod_{j=1}^{V}P(w^i_j|y^i)^{n_{ij}}
∏j=1VP(wji∣yi)nij,其中
n
i
j
n_{ij}
nij代表单词j出现在文档i的次数。这里
w
j
w_j
wj代表词典库里的第j个单词。
=
∑
i
=
1
N
∑
j
=
1
V
n
i
j
l
o
g
P
(
w
j
∣
y
i
)
+
∑
i
=
1
N
l
o
g
P
(
y
i
)
(9)
\,\quad\quad\quad\quad\quad\quad\quad\quad\quad=\sum_{i=1}^N \sum_{j=1}^V n_{ij} logP(w_j|y^i) +\sum_{i=1}^NlogP(y^i) \tag{9}
=i=1∑Nj=1∑VnijlogP(wj∣yi)+i=1∑NlogP(yi)(9)从式子(8)到(9)利用了log的性质。比如
l
o
g
x
y
=
y
l
o
g
x
logx^y=ylogx
logxy=ylogx,
l
o
g
∏
i
=
1
P
(
x
i
)
=
∑
i
=
1
l
o
g
P
(
x
i
)
log\prod_{i=1}P(x^i)=\sum_{i=1}logP(x^i)
log∏i=1P(xi)=∑i=1logP(xi),且
l
o
g
P
(
y
i
)
logP(y^i)
logP(yi)没有包含单词j,所以只需要用
∑
i
=
1
N
\sum_{i=1}^N
∑i=1N累加各类文档的对数概率即可。
=
∑
k
=
1
K
∑
i
:
y
i
=
k
∑
j
=
1
V
n
i
j
l
o
g
P
(
w
j
∣
y
i
=
k
)
+
∑
k
=
1
K
∑
i
:
y
i
=
k
l
o
g
P
(
y
i
=
k
)
(10)
\,\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad=\sum_{k=1}^K\sum_{i:y^i=k}\sum_{j=1}^Vn_{ij}logP(w_j|y^i=k)+\sum_{k=1}^K\sum_{i:y^i=k}logP(y^i=k) \tag{10}
=k=1∑Ki:yi=k∑j=1∑VnijlogP(wj∣yi=k)+k=1∑Ki:yi=k∑logP(yi=k)(10)将公式(9)的
∑
i
=
1
N
\sum_{i=1}^N
∑i=1N拆分成
∑
k
=
1
K
∑
i
:
y
i
=
k
\sum_{k=1}^K\sum_{i:y^i=k}
∑k=1K∑i:yi=k,这里的
i
:
y
i
=
k
i:y^i=k
i:yi=k代表属于类别k的所有文档。所以这里
∑
i
:
y
i
=
k
l
o
g
P
(
y
i
=
k
)
\sum_{i:y^i=k}logP(y^i=k)
∑i:yi=klogP(yi=k)表示类别k在所有类别中的对数概率,
∑
i
:
y
i
=
k
\sum_{i:y^i=k}
∑i:yi=k表示属于类别k的每个文档逐个加和。
=
∑
k
=
1
K
∑
i
:
y
i
=
k
∑
j
=
1
V
n
i
j
l
o
g
Θ
k
j
+
∑
k
=
1
k
∑
i
:
y
i
=
k
l
o
g
π
k
(11)
\,\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad=\sum_{k=1}^K\sum_{i:y^i=k}\sum_{j=1}^Vn_{ij}logΘ_{kj}+\sum_{k=1}^k\sum_{i:y^i=k}logπ_{k} \tag{11}
=k=1∑Ki:yi=k∑j=1∑VnijlogΘkj+k=1∑ki:yi=k∑logπk(11)用
Θ
k
j
Θ_{kj}
Θkj代替
P
(
w
j
∣
y
i
=
k
)
P(w_{j}|y^i=k)
P(wj∣yi=k),用
π
k
π_{k}
πk代替
P
(
y
i
=
k
)
P(y^i=k)
P(yi=k)。
∑
k
=
1
K
∑
i
:
y
i
=
k
∑
j
=
1
V
n
i
j
l
o
g
Θ
k
j
+
∑
k
=
1
K
n
k
l
o
g
π
k
(12)
\sum_{k=1}^K\sum_{i:y^i=k}\sum_{j=1}^Vn_{ij}logΘ_{kj}+\sum_{k=1}^K n_{k}logπ_{k} \tag{12}
k=1∑Ki:yi=k∑j=1∑VnijlogΘkj+k=1∑Knklogπk(12)
n
k
n_{k}
nk表示属于类别k的文件个数,因为
∑
i
:
y
i
=
k
\sum_{i:y^i=k}
∑i:yi=k表示属于类别k的每个文档逐个加和,所有可表示成属于类别k的文档总数,即
∑
i
:
y
i
=
k
π
k
=
n
k
π
k
\sum_{i:y^i=k}π_{k}=n_{k}π_{k}
∑i:yi=kπk=nkπk。另外,有两个约束条件需要满足,分别是:
∑
u
=
1
K
π
u
=
1
(13)
\sum_{u=1}^Kπ_{u}=1 \tag{13}
u=1∑Kπu=1(13)
∑
v
=
1
V
Θ
k
v
=
1
,
f
o
r
k
=
1
,
2
,
.
.
.
,
K
(14)
\sum_{v=1}^VΘ_{kv}=1,for\quad k=1,2,...,K \tag{14}
v=1∑VΘkv=1,fork=1,2,...,K(14)条件(13)表示所有的类别的概率加在一起等于1,比如P(垃圾)+P(正常)=1。条件(14)表示的是对于任意一个分类k,出现在词典里的所有单词的总概率为1。
所以,这是个有约束条件的优化问题。把约束条件和目标函数写在一起即可以得到:
M
a
x
i
m
i
z
e
L
=
∑
k
=
1
K
∑
i
:
y
i
=
k
∑
j
=
1
V
n
i
j
l
o
g
Θ
k
j
+
∑
k
=
1
K
n
k
l
o
g
π
k
Maximize \quad L=\sum_{k=1}^K\sum_{i:y^i=k}\sum_{j=1}^Vn_{ij}logΘ_{kj}+\sum_{k=1}^K n_{k}logπ_{k}
MaximizeL=k=1∑Ki:yi=k∑j=1∑VnijlogΘkj+k=1∑Knklogπk
s
.
t
.
∑
u
=
1
K
π
u
=
1
(15)
s.t.\sum_{u=1}^Kπ_{u}=1 \tag{15}
s.t.u=1∑Kπu=1(15)
∑
v
=
1
V
Θ
k
v
=
1
,
f
o
r
k
=
1
,
2
,
.
.
.
,
K
(16)
\sum_{v=1}^VΘ_{kv}=1,for\quad k=1,2,...,K \tag{16}
v=1∑VΘkv=1,fork=1,2,...,K(16)利用拉格朗日乘法项,我们可以把目标函数写成:
M
a
x
i
m
i
z
e
L
=
∑
k
=
1
K
∑
i
:
y
i
=
k
∑
j
=
1
V
n
i
j
l
o
g
Θ
k
j
+
∑
k
=
1
K
n
k
l
o
g
π
k
+
λ
(
∑
u
=
1
K
π
u
−
1
)
+
∑
k
=
1
K
λ
k
(
∑
v
=
1
V
Θ
k
v
−
1
)
(17)
Maximize \, L=\sum_{k=1}^K\sum_{i:y^i=k}\sum_{j=1}^Vn_{ij}logΘ_{kj}+\sum_{k=1}^K n_{k}logπ_{k}+λ(\sum_{u=1}^Kπ_{u}-1)+\sum_{k=1}^Kλ_k(\sum_{v=1}^VΘ_{kv}-1) \tag{17}
MaximizeL=k=1∑Ki:yi=k∑j=1∑VnijlogΘkj+k=1∑Knklogπk+λ(u=1∑Kπu−1)+k=1∑Kλk(v=1∑VΘkv−1)(17)
λ
λ
λ为拉格朗日乘数,是一个实数,而
∑
k
=
1
K
λ
k
(
∑
v
=
1
V
Θ
k
v
−
1
)
\sum_{k=1}^Kλ_k(\sum_{v=1}^VΘ_{kv}-1)
∑k=1Kλk(∑v=1VΘkv−1)表示对每个
∑
v
=
1
V
Θ
k
v
−
1
\sum_{v=1}^VΘ_{kv}-1
∑v=1VΘkv−1分别乘以对应的λ,然后加和。
2.2 找出最优解 π k π_{k} πk
2.2.1 找出最优解 π k π_{k} πk
我们需要设置导数为0,进而找出最优解。先求解 π k π_{k} πk,所以只要跟 π k π_{k} πk无关的项都可以不考虑,因为它们导数为0。L对 π k π_{k} πk的导数为: ∂ L ∂ π k = ∂ ( n k l o g π k + λ π k ) ∂ π k = n k π k + λ = 0 (18) \frac{∂L}{∂π_{k}} =\frac{∂(n_{k}logπ_{k}+λπ_{k})}{∂π_{k}}=\frac{n_{k}}{π_{k}}+λ=0 \tag{18} ∂πk∂L=∂πk∂(nklogπk+λπk)=πknk+λ=0(18)解为 π k = − 1 λ n k π_{k}=-\frac{1}{λ}n_{k} πk=−λ1nk。这里有个参数λ,但同时我们有一个约束条件是 ∑ u = 1 K π u = 1 \sum_{u=1}^Kπ_{u}=1 ∑u=1Kπu=1,把刚才的解带入这个条件中,得: ∑ u = 1 K − 1 λ n u = 1 (19) \sum_{u=1}^K-\frac{1}{λ}n_{u}=1 \tag{19} u=1∑K−λ1nu=1(19)则可求得 λ = − ∑ u = 1 K n u λ=-\sum_{u=1}^Kn_{u} λ=−∑u=1Knu。把λ再次带入到 π k = − 1 λ n k π_{k}=-\frac{1}{λ}n_{k} πk=−λ1nk里,可得: π k = n k ∑ u = 1 K n u (20) π_{k}=\frac{n_{k}}{\sum_{u=1}^Kn_{u}} \tag{20} πk=∑u=1Knunk(20)这里面 n k n_{k} nk为k类文档出现的个数,分母为所有文档的个数。
2.2.2 找出最优解 Θ k j Θ_{kj} Θkj
同理,我们需要求L对 Θ k j Θ_{kj} Θkj的导数,得: ∂ L ∂ Θ k j = ∂ [ ( ∑ i : y i = k l o g Θ k j ) + λ k ( ∑ v = 1 V Θ k v − 1 ) ] ∂ Θ k j = ∑ i : y i = k n i j Θ k j + λ k = 0 (21) \frac{∂L}{∂Θ_{kj}}=\frac{∂[(\sum_{i:y^i=k}logΘ_{kj})+λ_{k}(\sum_{v=1}^VΘ_{kv}-1)]}{∂Θ_{kj}}=\sum_{i:y^i=k}\frac{n_{ij}}{Θ_{kj}}+λ_{k}=0 \tag{21} ∂Θkj∂L=∂Θkj∂[(∑i:yi=klogΘkj)+λk(∑v=1VΘkv−1)]=i:yi=k∑Θkjnij+λk=0(21)解为 Θ k j = − 1 λ k ∑ i : y i = k n i j Θ_{kj}=-\frac{1}{λ_{k}}\sum_{i:y^i=k}n^{ij} Θkj=−λk1∑i:yi=knij。这里有个参数是 λ k λ_{k} λk,但同时我们有个约束条件 ∑ v = 1 V Θ k v = 1 \sum_{v=1}^VΘ_{kv}=1 ∑v=1VΘkv=1,把 Θ k j = − 1 λ k ∑ i : y i = k n i j Θ_{kj}=-\frac{1}{λ_{k}}\sum_{i:y^i=k}n^{ij} Θkj=−λk1∑i:yi=knij带入这个条件公式中,得: λ k = − 1 ∑ v = 1 V ∑ i : y i = k n i v (22) λ_{k}=-\frac{1}{\sum_{v=1}{V}\sum_{i:y^i=k}n_{iv}} \tag{22} λk=−∑v=1V∑i:yi=kniv1(22)把 λ k λ_{k} λk带入到上面的解,得: Θ k j = ∑ i : y i = k n i j ∑ v = 1 V ∑ i : y i = k n i v (23) Θ_{kj}=\frac{\sum_{i:y^i=k}n_{ij}}{\sum_{v=1}^V\sum_{i:y^i=k}n_{iv}} \tag{23} Θkj=∑v=1V∑i:yi=kniv∑i:yi=knij(23)这个式子中分子代表的是在所有类别为k的文档里出现了多少次 w j w_{j} wj,也就是词典库里的 j j j个单词。分母代表的是在类别为 k k k的所有文档里包含了总共多少个单词。