基本原理
朴素贝叶斯方法是基于样本的所有特征相互独立这一假设的,这使得模型的建立过程变得简单,但也牺牲了一定的分类准确性。
问题描述
给定一组训练样本集 T={(x1,y1),(x2,y2),⋯,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } ,其中 xi x i 是样本点的特征向量,每个 xi x i 是一个 n n 维的向量,即,特征向量的第 (j) ( j ) 个特征 x(j)i x i ( j ) 有 Sj S j 个可能的取值,分别为 {aj1,aj1,⋯,ajSj} { a j 1 , a j 1 , ⋯ , a j S j } ; yi y i 是样本点的类别, yi∈{c1,c2,⋯,cK} y i ∈ { c 1 , c 2 , ⋯ , c K } 。
问题分析
若我们能够得知特征向量和类别的联合概率模型
P(X,Y)
P
(
X
,
Y
)
,就能够通过在特征
X
X
给定的条件下概率最大的类别
Y
Y
将未知对象分类,因此对于给定了特征的未知对象,我们只需要知道使得
P(Y|X)
P
(
Y
|
X
)
最大的类别
ck
c
k
,并将其作为该对象的类别,这就是朴素贝叶斯算法的基本方法。
由贝叶斯定理我们知道,
P(Y|X)=P(XY)P(X)
P
(
Y
|
X
)
=
P
(
X
Y
)
P
(
X
)
,而
P(XY)=P(X|Y)P(Y)
P
(
X
Y
)
=
P
(
X
|
Y
)
P
(
Y
)
,因此
P(Y|X)=P(X|Y)P(Y)P(X)
P
(
Y
|
X
)
=
P
(
X
|
Y
)
P
(
Y
)
P
(
X
)
,我们要求使得
P(Y|X)=P(X|Y)P(Y)P(X)
P
(
Y
|
X
)
=
P
(
X
|
Y
)
P
(
Y
)
P
(
X
)
最大的
ck
c
k
,由于在特征给定时,
P(X)
P
(
X
)
是一定的,因此我们要求的实际上是使得
P(X|Y)P(Y)
P
(
X
|
Y
)
P
(
Y
)
最大的
ck
c
k
。假设对于特征向量为
X=[x(1),x(2),⋯,x(n)]
X
=
[
x
(
1
)
,
x
(
2
)
,
⋯
,
x
(
n
)
]
的对象,学习其类别的概率模型为
y=maxck P(X|Y=ck)P(Y=ck)=P(X(1)=x(1),⋯,X(n)=x(n)|Y=ck)P(Y=ck)
y
=
m
a
x
c
k
P
(
X
|
Y
=
c
k
)
P
(
Y
=
c
k
)
=
P
(
X
(
1
)
=
x
(
1
)
,
⋯
,
X
(
n
)
=
x
(
n
)
|
Y
=
c
k
)
P
(
Y
=
c
k
)
,本文开始已经提到过,朴素贝叶斯算法假设样本的所有特征是相互独立的,因此,上式可以写为:
在给定了训练数据集 T T 的情况下,上面式子中的和 P(X(j)=x(j)|Y=ck) P ( X ( j ) = x ( j ) | Y = c k ) 可以通过训练数据集来估计。 P(Y=ck) P ( Y = c k ) 和 P(X(j)=x(j)|Y=ck) P ( X ( j ) = x ( j ) | Y = c k ) 的估计方法分别如下:
其中 k=1,⋯,K;j=1,⋯,n;l=1,⋯,Sj k = 1 , ⋯ , K ; j = 1 , ⋯ , n ; l = 1 , ⋯ , S j 。函数 I I 为指示函数,举个例子来说明函数, ∑Ni=1I(yi=ck) ∑ i = 1 N I ( y i = c k ) 的函数值为训练样本集 T T 的个样本点中类别为 ck c k 的样本点数量。 P(X(j)=ajl|Y=ck) P ( X ( j ) = a j l | Y = c k ) 是类别为 ck c k 的条件下,第 j j 个特征取值为的概率估计值。
算法步骤
下面是朴素贝叶斯算法的具体步骤。
- 输入:训练样本集 T={(x1,y1),(x2,y2),⋯,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } ,待分类对象 x x
- 输出:的类别
y
y
step1 计算先验概率和条件概率:
其中 k=1,⋯,K;j=1,⋯,n;l=1,⋯,Sj k = 1 , ⋯ , K ; j = 1 , ⋯ , n ; l = 1 , ⋯ , S j 。
step2 对于对象 x=[a1l1,⋯,anln] x = [ a 1 l 1 , ⋯ , a n l n ] ,计算
P(Y=ck)∏j=1nP(X(j)=ajlj|Y=ck)k=1,⋯,K P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = a j l j | Y = c k ) k = 1 , ⋯ , K
step3 对象 x x 的类别为:
平滑因子
训练样本点数量有限,因此在上述算法中可能会出现估计的概率值为0的情况,这使我们无法判断未知对象的类别,这种情况下,我们可以在朴素贝叶斯算法中引入一个平滑因子
λ(λ>0)
λ
(
λ
>
0
)
,引入平滑因子后,先验概率和条件概率的估计形式如下:
可以通过计算验证对任意的 k=1,⋯,K、j=1,⋯,n和l=1,⋯,Sj k = 1 , ⋯ , K 、 j = 1 , ⋯ , n 和 l = 1 , ⋯ , S j ,有
事实上,
下面给出加入平滑因子的朴素贝叶斯算法。
- 输入:训练样本集 T={(x1,y1),(x2,y2),⋯,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } ,待分类对象 x x
- 输出:的类别
y
y
step1 计算先验概率和条件概率:
其中 k=1,⋯,K;j=1,⋯,n;l=1,⋯,Sj k = 1 , ⋯ , K ; j = 1 , ⋯ , n ; l = 1 , ⋯ , S j 。
step2 对于对象 x=[a1l1,⋯,anln] x = [ a 1 l 1 , ⋯ , a n l n ] ,计算
Pλ(Y=ck)∏j=1nPλ(X(j)=ajlj|Y=ck)k=1,⋯,K P λ ( Y = c k ) ∏ j = 1 n P λ ( X ( j ) = a j l j | Y = c k ) k = 1 , ⋯ , K
step3 对象 x x 的类别为:
sklearn实现
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
clf = MultinomialNB()
clf.fit(X, y)
test = X[2:3].copy()
test[0,-1] = np.random.randint(5)
print (test)
#[[1 1 4 0 0 4 4 1 0 4 0 3 3 3 0 2 1 2 3 3 0 2 1 3 4 0 3 1 4 0 0 0 4 0 4 4
# 0 0 3 4 0 4 3 2 4 2 1 3 2 3 2 0 4 1 4 2 2 0 1 0 0 4 0 2 0 1 2 4 4 0 4 2
# 0 1 3 1 2 2 2 0 2 3 1 3 1 0 0 4 2 1 4 3 2 0 4 4 0 1 3 2]]
print (X[2:3])
#[[1 1 4 0 0 4 4 1 0 4 0 3 3 3 0 2 1 2 3 3 0 2 1 3 4 0 3 1 4 0 0 0 4 0 4 4
# 0 0 3 4 0 4 3 2 4 2 1 3 2 3 2 0 4 1 4 2 2 0 1 0 0 4 0 2 0 1 2 4 4 0 4 2
# 0 1 3 1 2 2 2 0 2 3 1 3 1 0 0 4 2 1 4 3 2 0 4 4 0 1 3 3]]
print (clf.predict(test))
#[3]
参考文献
李航《统计学习方法》
sklearn官方教程:http://scikit-learn.org/stable/