朴素贝叶斯
朴素贝叶斯是生成方法,也就是直接找出特征输出Y和特征X的联合分布 P ( X , Y ) P(X,Y) P(X,Y),然后再利用 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)得出。
1. 相关的统计学知识
条件独立公式,如果X和Y相互独立:
P
(
X
,
Y
)
=
P
(
X
)
P
(
Y
)
P(X,Y) = P(X)P(Y)
P(X,Y)=P(X)P(Y)
条件概率公式:
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
(
Y
,
X
)
P
(
Y
)
P(X|Y) = \frac{P(Y,X)}{ P(Y) }
P(X∣Y)=P(Y)P(Y,X)
P
(
Y
∣
X
)
=
P
(
X
∣
Y
)
P
(
Y
)
P
(
X
)
P(Y|X) = P(X|Y)\frac{P(Y)}{P(X)}
P(Y∣X)=P(X∣Y)P(X)P(Y)
全概率公式:
P
(
X
)
=
∑
k
P
(
X
∣
Y
=
Y
k
)
P
(
Y
k
)
其
中
∑
k
P
(
Y
k
)
=
1
P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1
P(X)=k∑P(X∣Y=Yk)P(Yk)其中k∑P(Yk)=1
贝叶斯公式:
P
(
Y
k
∣
X
)
=
P
(
X
∣
Y
k
)
P
(
Y
k
)
∑
k
P
(
X
∣
Y
=
Y
k
)
P
(
Y
k
)
P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}
P(Yk∣X)=k∑P(X∣Y=Yk)P(Yk)P(X∣Yk)P(Yk)
2.朴素贝叶斯模型
对于数据分析,假设分类模型的样本是:
(
x
1
(
1
)
,
x
2
(
1
)
,
.
.
.
x
n
(
1
)
,
y
1
)
,
(
x
1
(
2
)
,
x
2
(
2
)
,
.
.
.
x
n
(
2
)
,
y
2
)
,
.
.
.
(
x
1
(
m
)
,
x
2
(
m
)
,
.
.
.
x
n
(
m
)
,
y
n
)
(x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)
(x1(1),x2(1),...xn(1),y1),(x1(2),x2(2),...xn(2),y2),...(x1(m),x2(m),...xn(m),yn)
即表示有m个样本,每个样本有n个特征,特征输出有K个类别,定义为:
C
1
,
C
2
,
C
3
,
.
.
.
.
.
.
C
K
C_1, C_2, C_3,......C_K
C1,C2,C3,......CK。
从样本中可以学习得到朴素贝叶斯的先验分布概率
P
(
Y
=
C
i
)
(
i
=
1
,
2
,
3
,
.
.
.
K
)
P(Y=C_i)(i=1, 2,3,...K)
P(Y=Ci)(i=1,2,3,...K),接着可以学习到条件概率分布
P
(
X
=
x
∣
Y
=
C
k
)
=
P
(
X
1
=
x
1
,
X
2
=
x
2
,
.
.
.
X
n
=
x
n
∣
Y
=
C
k
)
P(X=\mathcal{x}| Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)
P(X=x∣Y=Ck)=P(X1=x1,X2=x2,...Xn=xn∣Y=Ck),然户就可以利用贝叶斯公式可以得到X和Y的联合概率分布
P
(
X
,
Y
)
P(X,Y)
P(X,Y),联合概率分布定义为
P
(
X
,
Y
)
P(X,Y)
P(X,Y):
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ P(X,Y=C_k) &=…
上面的式子可以看出:虽然条件分布的求解被简化了,但是也带来了预测的不准确性,如果特征之间非常不独立,那就尽量避免使用朴素贝叶斯模型,对于一般情况下,样本的各个特征之间相互独立这个条件是弱成立的,尤其在数据量非常大的时候,虽然朴素贝叶斯模型牺牲了准确性,但是却带来了计算的简化。
回归到需要解决的问题,问题是给定一个行的样本特征
(
x
1
(
t
e
s
t
)
,
x
2
(
t
e
s
t
)
,
.
.
.
x
n
(
t
e
s
t
)
(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}
(x1(test),x2(test),...xn(test),需要解决的问题是判断它属于那个特征。
对于贝叶斯模型,使用后验概率最大化来判断分类,只要计算出所有的K个条件概率
P
(
Y
=
C
k
∣
X
=
X
(
t
e
s
t
)
)
P(Y=C_k|X=X^{(test)})
P(Y=Ck∣X=X(test)),然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。
3. 朴素贝叶斯的推断过程
需要预测的类别 C r e s u l t C_{result} Cresult是使 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck∣X=X(test))最大化的类别,数学表达式为:
\begin{align} C_{result} & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\& = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \Bigg{/}P(X=X^{(test)}) \end{align}
由于对于所有的类别计算
P
(
Y
=
C
k
∣
X
=
X
(
t
e
s
t
)
)
P(Y=C_k|X=X^{(test)})
P(Y=Ck∣X=X(test))时,上式的分母是一样的,都是
P
(
X
=
X
(
t
e
s
t
)
P(X=X^{(test)}
P(X=X(test),因此,预测公式可以简化为:
C
r
e
s
u
l
t
=
a
r
g
m
a
x
⎵
C
k
P
(
X
=
X
(
t
e
s
t
)
∣
Y
=
C
k
)
P
(
Y
=
C
k
)
C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k)
Cresult=Ck
argmaxP(X=X(test)∣Y=Ck)P(Y=Ck)
利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:
C
r
e
s
u
l
t
=
a
r
g
m
a
x
⎵
C
k
P
(
Y
=
C
k
)
∏
j
=
1
n
P
(
X
j
=
X
j
(
t
e
s
t
)
∣
Y
=
C
k
)
C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k)
Cresult=Ck
argmaxP(Y=Ck)j=1∏nP(Xj=Xj(test)∣Y=Ck)
4. 朴素贝叶斯的参数估计
上面可以得到只要我们求出
P
(
Y
=
C
k
)
和
P
(
X
j
=
X
j
(
t
e
s
t
)
∣
Y
=
C
k
)
(
j
=
1
,
2
,
.
.
.
n
)
P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)
P(Y=Ck)和P(Xj=Xj(test)∣Y=Ck)(j=1,2,...n),通过比较就可以得到朴素贝叶斯的推断结果,下面讨论如何通过训练集来计算这两个概率:
对于
P
(
Y
=
C
k
)
P(Y=C_k)
P(Y=Ck),通过极大似然估计很容易得到
P
(
Y
=
C
k
)
P(Y=C_k)
P(Y=Ck)样本类别
C
k
C_k
Ck出现的频率,即样本类别
C
k
C_k
Ck出现的次数
m
K
m_K
mK除以样本总数
m
m
m。
而对于
P
(
X
j
=
X
j
(
t
e
s
t
)
∣
Y
=
C
k
)
(
j
=
1
,
2
,
.
.
.
n
)
P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)
P(Xj=Xj(test)∣Y=Ck)(j=1,2,...n)取决于我们的先验条件:
- 如果
X
j
X_j
Xj是离散的值,可以假设
X
j
X_j
Xj符合多项式分布,这样得到
P
(
X
j
=
X
j
(
t
e
s
t
)
∣
Y
=
C
k
)
P(X_j=X_j^{(test)}|Y=C_k)
P(Xj=Xj(test)∣Y=Ck)是在样本类别
C
k
C_k
Ck中,特征
X
j
(
t
e
s
t
)
X_j^{(test)}
Xj(test)出现的频率,即:
P ( X j = X j ( t e s t ) ∣ Y = C k ) = m k j t e s t m k P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k} P(Xj=Xj(test)∣Y=Ck)=mkmkjtest
其中 m k m_k mk为样本类别 C k C_k Ck总的特征计数,而mkjtest为类别为 C k C_k Ck的样本中,第j维特征 X j ( t e s t ) X^{(test)}_j Xj(test)出现的计数。
某些时候,可能某些类别在样本中没有出现,这样可能导致 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck)为0,这样会影响后验的估计,为了解决这种情况,我们引入了拉普拉斯平滑,即此时有:
P ( X j = X j ( t e s t ) ∣ Y = C k ) = m k j t e s t + λ m k + O j λ P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda} P(Xj=Xj(test)∣Y=Ck)=mk+Ojλmkjtest+λ
其中 λ \lambda λ 为一个大于0的常数,常常取为1。 O j O_j Oj为第j个特征的取值个数。
2. 如果 X j X_j Xj是非常稀疏的离散值,即表示各个特征出现的概率很低,这个时候我们可以假设 X j X_j Xj符合伯努利分布,即特征 X j X_j Xj出现记为1,不出现记为0,即表示只要 X j X_j Xj出现即可,不关注 X j X_j Xj的出现次数,这样得到的 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck)是在样本类别 C k C_k Ck中, X j ( t e s t ) X_j^{(test)} Xj(test)出现的频率。此时有:
P ( X j = X j ( t e s t ) ∣ Y = C k ) = P ( X j ∣ Y = C k ) X j ( t e s t ) + ( 1 − P ( X j ∣ Y = C k ) ) ( 1 − X j ( t e s t ) ) P(X_j=X_j^{(test)}|Y=C_k) = P(X_j|Y=C_k)X_j^{(test)} + (1 - P(X_j|Y=C_k))(1-X_j^{(test)}) P(Xj=Xj(test)∣Y=Ck)=P(Xj∣Y=Ck)Xj(test)+(1−P(Xj∣Y=Ck))(1−Xj(test))
其中, X j ( t e s t ) X_j^{(test)} Xj(test)的取值为0或者1。
3. 如果 X j X_j Xj是连续值,我们通常取 X j X_j Xj的先验概率为正态分布,即表示在样本类别 C k C_k Ck中, X j X_j Xj的这个值符合正态分布。这样的话, P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj=Xj(test)∣Y=Ck)的概率分布为:
KaTeX parse error: Invalid delimiter: '{"type":"ordgroup","mode":"math","loc":{"lexer":{"input":" P(X_j=X_j^{(test)}|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(X_j^{(test)} - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":71,"end":74},"body":[{"type":"atom","mode":"math","family":"open","loc":{"lexer":{"input":" P(X_j=X_j^{(test)}|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(X_j^{(test)} - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":72,"end":73},"text":"("}]}' after '\Bigg' at position 72: …a_k^2}}exp\Bigg{̲(̲}̲-\frac{(X_j^{(t…
其中 μ k 和 σ k 2 \mu_k和\sigma_k^2 μk和σk2正态分布的期望和方差,可以通过极大似然估计求得。 μ k \mu_k μk为在样本类别 C k C_k Ck中,所有 X j X_j Xj的平均值。 σ k 2 \sigma^2_k σk2为在样本类别 C k C_k Ck中,所有 X − j X-j X−j的方差。对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。
5. 朴素贝叶斯算法过程
我们假设训练集为m个样本n个维度,如下:
(
x
1
(
0
)
,
x
2
(
0
)
,
.
.
.
x
n
(
0
)
,
y
0
)
,
(
x
1
(
1
)
,
x
2
(
1
)
,
.
.
.
x
n
(
1
)
,
y
1
)
,
.
.
.
(
x
1
(
m
)
,
x
2
(
m
)
,
.
.
.
x
n
(
m
)
,
y
n
)
(x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)
(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),yn)
共有K个特征输出类别,分别为
C
1
,
C
2
,
.
.
.
,
C
K
{C_1,C_2,...,C_K}
C1,C2,...,CK,每个特征输出类别的样本个数为
m
1
,
m
2
,
.
.
.
,
m
K
{m_1,m_2,...,m_K}
m1,m2,...,mK,在第k个类别中,如果是离散特征,则特征
X
j
X_j
Xj各个类别取值为
m
j
l
m_{jl}
mjl。其中
l
l
l取值为
1
,
2
,
.
.
.
S
j
1,2,...S_j
1,2,...Sj,
X
j
X_j
Xj为特征
j
j
j不同的取值数。
输出为
X
(
t
e
s
t
)
X^{(test)}
X(test)的分类。
算法流程如下:
1. 如果没有
Y
Y
Y的先验概率,则计算
Y
Y
Y的
K
K
K个先验概率:
P
(
Y
=
C
k
)
=
(
m
k
+
λ
)
/
(
m
+
K
λ
)
P(Y=C_k) = (m_k+\lambda)/(m+K\lambda)
P(Y=Ck)=(mk+λ)/(m+Kλ),否则
P
(
Y
=
C
k
)
P(Y=C_k)
P(Y=Ck)为输入的先验概率。
2. 分别计算第
k
k
k个类别的第j维特征的第
l
l
l个个取值条件概率:
P
(
X
j
=
x
j
l
∣
Y
=
C
k
)
P(X_j=x_{jl}|Y=C_k)
P(Xj=xjl∣Y=Ck)
2.1 如果是离散值:
P
(
X
j
=
x
j
l
∣
Y
=
C
k
)
=
m
k
j
l
+
λ
m
k
+
S
j
λ
P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda}
P(Xj=xjl∣Y=Ck)=mk+Sjλmkjl+λ
λ
\lambda
λ可以取值为1,或者其他大于0的数字。
2.2 果是稀疏二项离散值:
P
(
X
j
=
x
j
l
∣
Y
=
C
k
)
=
P
(
j
∣
Y
=
C
k
)
x
j
l
+
(
1
−
P
(
j
∣
Y
=
C
k
)
(
1
−
x
j
l
)
P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl})
P(Xj=xjl∣Y=Ck)=P(j∣Y=Ck)xjl+(1−P(j∣Y=Ck)(1−xjl)
此时
l
l
l只有两种取值。
2.3 如果是连续值不需要计算各个l的取值概率,直接求正态分布的参数:
KaTeX parse error: Invalid delimiter: '{"type":"ordgroup","mode":"math","loc":{"lexer":{"input":" P(X_j=x_j|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(x_j - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":62,"end":65},"body":[{"type":"atom","mode":"math","family":"open","loc":{"lexer":{"input":" P(X_j=x_j|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(x_j - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":63,"end":64},"text":"("}]}' after '\Bigg' at position 63: …a_k^2}}exp\Bigg{̲(̲}̲-\frac{(x_j - \…
需要求出
μ
k
\mu_k
μk和
σ
k
2
\sigma^2_k
σk2。
μ
k
\mu_k
μk为在样本类别
C
k
C_k
Ck中,所有
X
j
X_j
Xj的平均值。
σ
k
2
\sigma_k^2
σk2为在样本
C
k
C_k
Ck中,所有
X
j
X_j
Xj的方差。
3. 对于实例
X
(
t
e
s
t
)
X^{(test)}
X(test),分别计算:
P
(
Y
=
C
k
)
∏
j
=
1
n
P
(
X
j
=
x
j
(
t
e
s
t
)
∣
Y
=
C
k
)
P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k)
P(Y=Ck)j=1∏nP(Xj=xj(test)∣Y=Ck)
4. 确定实例
X
(
t
e
s
t
)
X^{(test)}
X(test)的分类结果
C
r
e
s
u
l
t
C_{result}
Cresult:
C
r
e
s
u
l
t
=
a
r
g
m
a
x
⎵
C
k
P
(
Y
=
C
k
)
∏
j
=
1
n
P
(
X
j
=
X
j
(
t
e
s
t
)
∣
Y
=
C
k
)
C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k)
Cresult=Ck
argmaxP(Y=Ck)j=1∏nP(Xj=Xj(test)∣Y=Ck)
从上面的计算可以看出,没有复杂的求导和矩阵运算,因此效率很高。
6. 朴素贝叶斯算法小结
朴素贝叶斯的主要优点有:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
朴素贝叶斯的主要缺点有:
- 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
- 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
- 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
- 对输入数据的表达形式很敏感。