文章目录
1. 朴素贝叶斯法
1.1 简介与定义
朴素 贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立的假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入 x x x,利用贝叶斯定理求出后验概率最大的输出 y y y。其中,条件概率有如下表达形式: P ( Y ∣ X ) = P ( X , Y ) P ( X ) , P ( X ∣ Y ) = P ( X , Y ) P ( Y ) {\rm P(Y|X)=\frac{{\rm P}(X,Y)}{P(X)}},\ {\rm P(X|Y)=\frac{{\rm P}(X,Y)}{P(Y)}} P(Y∣X)=P(X)P(X,Y), P(X∣Y)=P(Y)P(X,Y)
1.2 基本方法
设输入空间 X ⊆ R n {\mathcal X}\subseteq {\bold R}^n X⊆Rn为 n n n维向量的集合,输出空间维类标记集合 Y = { c 1 , c 2 , . . . , c n } {\mathcal Y}=\{c_1,c_2,...,c_n\} Y={c1,c2,...,cn}。输入为特征向量 x ∈ X x\in{\mathcal X} x∈X,输出为类标记 y ∈ Y y\in{\mathcal Y} y∈Y。 X X X是定义在输入空间 X {\mathcal X} X上的随机变量, Y Y Y是定义在输入空间 Y {\mathcal Y} Y上的随机变量。 P ( X , Y ) P(X,Y) P(X,Y)是 X X X和 Y Y Y的联合概率分布。训练数据集: T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_2),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y2),(x2,y2),...,(xN,yN)}
由 P ( X , Y ) P(X,Y) P(X,Y)独立同分布产生。朴素贝叶斯法通过训练数据集学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)。具体地,学习以下先验概率分布及条件概率分布。先验概率分布为: P ( Y = c k ) , k = 1 , 2 , . . . , K P(Y=c_k),\ k=1,2,...,K P(Y=ck), k=1,2,...,K
条件概率分布为: P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) , k = 1 , 2 , . . . , K (1) P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k),\ k=1,2,...,K\tag{1} P(X=x∣Y=ck)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck), k=1,2,...,K(1)
通过先验概率分布和条件概率分布学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)。实际上,条件概率分布 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=x∣Y=ck)有指数级的参数量,其估计实际是不可行的。即,假设 x ( j ) x^{(j)} x(j)可取值有 S j S_j Sj个, j = 1 , 2 , . . . , n j=1,2,...,n j=1,2,...,n, Y Y Y可取值有 K K K个,那么总的参数个数为 K ∏ j = 1 n S j K\prod \limits_{j=1}^nS_j Kj=1∏nSj。因此,朴素贝叶斯对条件概率作了条件独立性的假设。具体的假设条件为: P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) , k = 1 , 2 , . . . , K = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) (2) \begin{aligned} P(X=x|Y=c_k)&=P(X^{(1)}=x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k),\ k=1,2,...,K \\ &=\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k) \end{aligned}\tag{2} P(X=x∣Y=ck)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck), k=1,2,...,K=j=1∏nP(X(j)=x(j)∣Y=ck)(2)
在使用朴素贝叶斯法分类时,对于给定的输入 x x x,通过学习到的模型计算后验概率分布 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck∣X=x),然后将后验概率最大的类作为 x x x的类输出。具体地,后验概率根据贝叶斯定理得到 P ( Y = c k ∣ X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) (3) P(Y=c_k|X=x)=\frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum \limits_kP(X=x|Y=c_k)P(Y=c_k)}\tag{3} P(Y=ck∣X=x)=k∑P(X=x∣Y=ck)P(Y=ck)P(X=x∣Y=ck)P(Y=ck)(3)
将(2)代入(3)中,得到: P ( Y = c k ∣ X = x ) = P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , . . . , K (4) P(Y=c_k|X=x)=\frac{P(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k)}{\sum \limits_kP(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k)},\ k=1,2,...,K\tag{4} P(Y=ck∣X=x)=k∑P(Y=ck)j∏P(X(j)=x(j)∣Y=ck)P(Y=ck)j∏P(X(j)=x(j)∣Y=ck), k=1,2,...,K(4)
于是,朴素贝叶斯分类器可表示为: y = f ( x ) = arg max c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) (5) y=f(x)=\argmax_{c_k}\frac{P(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k)}{\sum \limits_kP(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k)}\tag{5} y=f(x)=ckargmaxk∑P(Y=ck)j∏P(X(j)=x(j)∣Y=ck)P(Y=ck)j∏P(X(j)=x(j)∣Y=ck)(5)
上式可简化为: y = arg max c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) (6) y=\argmax_{c_k}P(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k)\tag{6} y=ckargmaxP(Y=ck)j∏P(X(j)=x(j)∣Y=ck)(6)
2. 朴素贝叶斯法的参数估计
2.1 极大似然估计
在朴素贝叶斯法中,学习意味着估计 P ( Y = c k ) P(Y=c_k) P(Y=ck)和 P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X^{(j)}=x^{(j)}|Y=c_k) P(X(j)=x(j)∣Y=ck)。可以应用极大似然估计法估计相应的概率。先验概率 P ( Y = c k ) P(Y=c_k) P(Y=ck)的极大似然估计是: P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K (7) P(Y=c_k)=\frac{\sum \limits_{i=1}^NI(y_i=c_k)}{N},\ k=1,2,...,K\tag{7} P(Y=ck)=Ni=1∑NI(yi=ck), k=1,2,...,K(7)
设第 j j j个特征 x ( j ) x^{(j)} x(j)可能取值的集合为 { a j 1 , a j 2 , . . . , a j S j } \{a_{j1},a_{j2},...,a_{jS_j}\} {aj1,aj2,...,ajSj},条件概率 P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X^{(j)}=x^{(j)}|Y=c_k) P(X(j)=x(j)∣Y=ck)的极大似然估计是: P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) j = 1 , 2 , . . . , n ; l = 1 , 2 , . . . , S j , k = 1 , 2 , . . . , K (8) P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum \limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)}{\sum \limits_{i=1}^NI(y_i=c_k)}\\ j=1,2,...,n;\ l=1,2,...,S_j,\ k=1,2,...,K\tag{8} P(X(j)=ajl∣Y=ck)=i=1∑NI(yi=ck)i=1∑NI(xi(j)=ajl,yi=ck)j=1,2,...,n; l=1,2,...,Sj, k=1,2,...,K(8)
式中, x ( j ) x^{(j)} x(j)是第 i i i个样本的第 j j j个特征; a j l a_{jl} ajl是第 j j j个特征可能取的第 l l l个值; I I I为指示函数。
2.2 学习与分类算法
朴素贝叶斯算法
输入:训练数据 T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_2),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y2),(x2,y2),...,(xN,yN)},其中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( n ) ) T x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^{\rm T} xi=(xi(1),xi(2),...,xi(n))T, x ( j ) x^{(j)} x(j)是第 i i i个样本的第 j j j个特征, x i ( j ) ∈ { a j 1 , a j 2 , . . . , a j S j } x_i^{(j)}\in\{a_{j1},a_{j2},...,a_{jS_j}\} xi(j)∈{aj1,aj2,...,ajSj}, a j l a_{jl} ajl是第 j j j个特征可能取的第 l l l个值, j = 1 , 2 , . . . , n , l = 1 , 2 , . . . , S j , y i ∈ { c 1 , c 2 , . . . , c k } j=1,2,...,n,l=1,2,...,S_j,y_i\in\{c_1,c_2,...,c_k\} j=1,2,...,n,l=1,2,...,Sj,yi∈{c1,c2,...,ck};实例 x x x;
输出:实例 x x x的分类。
(1)计算先验概率及条件概率: P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K P(Y=c_k)=\frac{\sum \limits_{i=1}^NI(y_i=c_k)}{N},\ k=1,2,...,K P(Y=ck)=Ni=1∑NI(yi=ck), k=1,2,...,K
P
(
X
(
j
)
=
a
j
l
∣
Y
=
c
k
)
=
∑
i
=
1
N
I
(
x
i
(
j
)
=
a
j
l
,
y
i
=
c
k
)
∑
i
=
1
N
I
(
y
i
=
c
k
)
j
=
1
,
2
,
.
.
.
,
n
;
l
=
1
,
2
,
.
.
.
,
S
j
,
k
=
1
,
2
,
.
.
.
,
K
P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum \limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)}{\sum \limits_{i=1}^NI(y_i=c_k)}\\ j=1,2,...,n;\ l=1,2,...,S_j,\ k=1,2,...,K
P(X(j)=ajl∣Y=ck)=i=1∑NI(yi=ck)i=1∑NI(xi(j)=ajl,yi=ck)j=1,2,...,n; l=1,2,...,Sj, k=1,2,...,K
\\
(2)对于给定的实例
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
.
.
.
,
x
i
(
n
)
)
T
x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^{\rm T}
xi=(xi(1),xi(2),...,xi(n))T,计算:
P
(
Y
=
c
k
)
∏
j
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
,
k
=
1
,
2
,
.
.
.
,
K
P(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k),\ k=1,2,...,K
P(Y=ck)j∏P(X(j)=x(j)∣Y=ck), k=1,2,...,K
\\
(3)确定实例
x
x
x的类:
y
=
arg max
c
k
P
(
Y
=
c
k
)
∏
j
P
(
X
(
j
)
=
x
(
j
)
∣
Y
=
c
k
)
.
y=\argmax_{c_k}P(Y=c_k)\prod\limits_jP(X^{(j)}=x^{(j)}|Y=c_k).
y=ckargmaxP(Y=ck)j∏P(X(j)=x(j)∣Y=ck).
例题 训练数据如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X ( 1 ) X^{(1)} X(1) | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 |
X ( 2 ) X^{(2)} X(2) | S S S | M M M | M M M | S S S | S S S | S S S | M M M | M M M | L L L | L L L | L L L | M M M | M M M | L L L | L L L |
Y Y Y | -1 | -1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 |
根据上面朴素贝叶斯算法的步骤:
(1)计算先验概率及条件概率:
P
(
Y
=
1
)
=
9
15
,
P
(
Y
=
−
1
)
=
6
15
P(Y=1)=\frac{9}{15},\ P(Y=-1)=\frac{6}{15}
P(Y=1)=159, P(Y=−1)=156
P ( X ( 1 ) = 1 ∣ Y = 1 ) = 2 9 , P ( X ( 1 ) = 2 ∣ Y = 1 ) = 3 9 , P ( X ( 1 ) = 3 ∣ Y = 1 ) = 4 9 P(X^{(1)}=1|Y=1)=\frac{2}{9},\ P(X^{(1)}=2|Y=1)=\frac{3}{9},\ P(X^{(1)}=3|Y=1)=\frac{4}{9} P(X(1)=1∣Y=1)=92, P(X(1)=2∣Y=1)=93, P(X(1)=3∣Y=1)=94
P ( X ( 2 ) = S ∣ Y = 1 ) = 1 9 , P ( X ( 2 ) = M ∣ Y = 1 ) = 4 9 , P ( X ( 2 ) = L ∣ Y = 1 ) = 4 9 P(X^{(2)}=S|Y=1)=\frac{1}{9},\ P(X^{(2)}=M|Y=1)=\frac{4}{9},\ P(X^{(2)}=L|Y=1)=\frac{4}{9} P(X(2)=S∣Y=1)=91, P(X(2)=M∣Y=1)=94, P(X(2)=L∣Y=1)=94
P ( X ( 1 ) = 1 ∣ Y = − 1 ) = 3 6 , P ( X ( 1 ) = 2 ∣ Y = − 1 ) = 2 6 , P ( X ( 1 ) = 3 ∣ Y = − 1 ) = 1 6 P(X^{(1)}=1|Y=-1)=\frac{3}{6},\ P(X^{(1)}=2|Y=-1)=\frac{2}{6},\ P(X^{(1)}=3|Y=-1)=\frac{1}{6} P(X(1)=1∣Y=−1)=63, P(X(1)=2∣Y=−1)=62, P(X(1)=3∣Y=−1)=61
P ( X ( 2 ) = S ∣ Y = − 1 ) = 4 6 , P ( X ( 2 ) = M ∣ Y = − 1 ) = 2 6 , P ( X ( 2 ) = L ∣ Y = − 1 ) = 1 6 P(X^{(2)}=S|Y=-1)=\frac{4}{6},\ P(X^{(2)}=M|Y=-1)=\frac{2}{6},\ P(X^{(2)}=L|Y=-1)=\frac{1}{6} P(X(2)=S∣Y=−1)=64, P(X(2)=M∣Y=−1)=62, P(X(2)=L∣Y=−1)=61
(2)对于给定的
x
=
(
2
,
S
)
T
x=(2,S)^{\rm T}
x=(2,S)T计算:
P
(
Y
=
1
)
P
(
X
(
1
)
=
2
∣
Y
=
1
)
P
(
X
(
2
)
=
S
∣
Y
=
1
)
=
1
45
P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{1}{45}
P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=451
P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 1 15 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{1}{15} P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=151
(3)取上一步中计算结果较大者对应的类别,则最终的输出为 y = − 1 y=-1 y=−1。
2.3 贝叶斯估计
用极大似然估计可能会出现所要估计的概率值为 0 0 0的情况。这时会影响后验概率的计算结果,从而使分类结果产生偏差。解决这一问题的方法是采用贝叶斯估计。首先,条件概率的贝叶斯估计是: P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ (9) P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum \limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)+\lambda}{\sum \limits_{i=1}^NI(y_i=c_k)+S_j\lambda}\tag{9} P(X(j)=ajl∣Y=ck)=i=1∑NI(yi=ck)+Sjλi=1∑NI(xi(j)=ajl,yi=ck)+λ(9)
上式中 λ ≥ 0 \lambda\geq0 λ≥0。等价于在随机变量各个取值的频数上赋予一个正数 λ > 0 \lambda>0 λ>0。当 λ = 0 \lambda=0 λ=0时就是极大似然估计。常取 λ = 1 \lambda=1 λ=1,这时称为拉普拉斯平滑。对于任何 l = 1 , 2 , . . . , S j , k = 1 , 2 , . . . , K l=1,2,...,S_j,\ k=1,2,...,K l=1,2,...,Sj, k=1,2,...,K,有: P λ ( X ( j ) = a j l ∣ Y = c k ) > 0 P_{\lambda}(X^{(j)}=a_{jl}|Y=c_k)>0 Pλ(X(j)=ajl∣Y=ck)>0
∑ l = 1 S j P ( X ( j ) = a j l ∣ Y = c k ) = 1 \sum_{l=1}^{S_j}P(X^{(j)}=a_{jl}|Y=c_k)=1 l=1∑SjP(X(j)=ajl∣Y=ck)=1
同样地,贝叶斯估计的先验概率为: P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + K λ P(Y=c_k)=\frac{\sum \limits_{i=1}^NI(y_i=c_k)+\lambda}{N+K\lambda} P(Y=ck)=N+Kλi=1∑NI(yi=ck)+λ
对于上述例题,同时取 λ = 1 \lambda=1 λ=1。
(1)计算先验概率及条件概率(
K
=
2
K=2
K=2):
P
(
Y
=
1
)
=
10
17
,
P
(
Y
=
−
1
)
=
7
17
P(Y=1)=\frac{10}{17},\ P(Y=-1)=\frac{7}{17}
P(Y=1)=1710, P(Y=−1)=177
P ( X ( 1 ) = 1 ∣ Y = 1 ) = 3 12 , P ( X ( 1 ) = 2 ∣ Y = 1 ) = 4 12 , P ( X ( 1 ) = 3 ∣ Y = 1 ) = 5 12 P(X^{(1)}=1|Y=1)=\frac{3}{12},\ P(X^{(1)}=2|Y=1)=\frac{4}{12},\ P(X^{(1)}=3|Y=1)=\frac{5}{12} P(X(1)=1∣Y=1)=123, P(X(1)=2∣Y=1)=124, P(X(1)=3∣Y=1)=125
P ( X ( 2 ) = S ∣ Y = 1 ) = 2 12 , P ( X ( 2 ) = M ∣ Y = 1 ) = 5 12 , P ( X ( 2 ) = L ∣ Y = 1 ) = 5 12 P(X^{(2)}=S|Y=1)=\frac{2}{12},\ P(X^{(2)}=M|Y=1)=\frac{5}{12},\ P(X^{(2)}=L|Y=1)=\frac{5}{12} P(X(2)=S∣Y=1)=122, P(X(2)=M∣Y=1)=125, P(X(2)=L∣Y=1)=125
P ( X ( 1 ) = 1 ∣ Y = − 1 ) = 4 9 , P ( X ( 1 ) = 2 ∣ Y = − 1 ) = 3 9 , P ( X ( 1 ) = 3 ∣ Y = − 1 ) = 2 9 P(X^{(1)}=1|Y=-1)=\frac{4}{9},\ P(X^{(1)}=2|Y=-1)=\frac{3}{9},\ P(X^{(1)}=3|Y=-1)=\frac{2}{9} P(X(1)=1∣Y=−1)=94, P(X(1)=2∣Y=−1)=93, P(X(1)=3∣Y=−1)=92
P ( X ( 2 ) = S ∣ Y = − 1 ) = 4 9 , P ( X ( 2 ) = M ∣ Y = − 1 ) = 3 9 , P ( X ( 2 ) = L ∣ Y = − 1 ) = 2 9 P(X^{(2)}=S|Y=-1)=\frac{4}{9},\ P(X^{(2)}=M|Y=-1)=\frac{3}{9},\ P(X^{(2)}=L|Y=-1)=\frac{2}{9} P(X(2)=S∣Y=−1)=94, P(X(2)=M∣Y=−1)=93, P(X(2)=L∣Y=−1)=92
(2)对于给定的
x
=
(
2
,
S
)
T
x=(2,S)^{\rm T}
x=(2,S)T计算:
P
(
Y
=
1
)
P
(
X
(
1
)
=
2
∣
Y
=
1
)
P
(
X
(
2
)
=
S
∣
Y
=
1
)
=
5
153
=
0.0327
P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{5}{153}=0.0327
P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1535=0.0327
P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 28 459 = 0.0610 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{28}{459}=0.0610 P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=45928=0.0610
(3)取上一步中计算结果较大者对应的类别,则最终的输出为 y = − 1 y=-1 y=−1。
3. Python实现朴素贝叶斯法
与前面两节不同的是,朴素贝叶斯法是一个多分类方法。因此,对于mnist数据集在处理类别时,我们不需要转换其类别:
def load_data(file):
# 定义空列表
dataArr = []
labelArr = []
# 打开并处理文件
with open(file, "r") as f:
lines = f.readlines()
for line in lines:
# 针对csv文件格式,使用','分割数据
curLine = line.strip().split(',')
# csv文件第一列存放着具体类别
labelArr.append(int(line[0]))
# 处理具体数据,为了简化计算量,将像素取值限制在01两个部分
# 如果不简化,处理的数据量是10×784×256,现在是10×784×2
dataArr.append([int(int(num) > 128) for num in curLine[1:]])
# 返回
return dataArr, labelArr
计算朴素贝叶斯法中的先验概率和条件概率,对应第(1)步:
def get_probabilities(trainData, trainLabel):
# 计算先验概率和条件概率,,对应第(1)步
# mnist数据集的样本大小为28×28,特征数为784
features = 784
# 0-9十个类别
nums = 10
# 计算先验概率,如pre_prob[0]存放类别0的先验概率
pre_prob = np.zeros((nums, 1))
for i in range(nums):
# 计算先验概率中的分子,1表示贝叶斯估计中的λ
fz = np.sum(np.mat(trainLabel) == i) + 1
# 计算对应类别的先验概率,10表示贝叶斯估计中的Kλ
pre_prob[i] = fz / (len(trainLabel) + 10)
# 对先验概率值取对数,保证其值不会因连乘造成浮点数溢出,详情请参考
# https://github.com/Dod-o/Statistical-Learning-Method_Code/blob/master/NaiveBayes/NaiveBayes.py#L129
pre_prob = np.log(pre_prob)
# 计算条件概率,第一维存放类别、第二维存放某一维特征、第三维存放处理后的像素值(0和1)
cond_prob = np.zeros((nums, features, 2))
for i in range(len(trainLabel)):
# 获取类别
label = trainLabel[i]
# 获取数据
data = trainData[i]
# 遍历数据
for j in range(features):
cond_prob[label][j][data[j]] += 1
# 计算条件概率中的分母
for i in range(nums):
for j in range(features):
# 分别获取类别为i、特征为j的01特征
# 如果没有简化数据处理,这里计算cond_proc[][][0-255]
p_0 = cond_prob[i][j][0]
p_1 = cond_prob[i][j][1]
# 计算条件概率的除法公式,2表示贝叶斯估计中的Sλ,取对数理由同上
cond_prob[i][j][0] = np.log((p_0 + 1) / (p_0 + p_1 + 2))
cond_prob[i][j][1] = np.log((p_1 + 1) / (p_0 + p_1 + 2))
# 返回先验概率和条件概率
return pre_prob, cond_prob
朴素贝叶斯法,采用贝叶斯估计,对应第(2)步和第(3)步:
def naive_bayes(pre, cond, data):
# mnist数据集的样本大小为28×28,特征数为784
features = 784
# 0-9十个类别
nums = 10
# 存放所有类别的概率
prob = [0] * nums
# 计算每一个类别的概率,对应第(2)步
for i in range(nums):
# 由于前面对数据作了取对数处理,所以本应该是概率相乘变成概率取对数的相加
su = 0
for j in range(features):
# 条件概率
su += cond[i][j][data[j]]
# 先验概率
prob[i] = su + pre[i]
# 返回最大值对应的索引类别
return prob.index(max(prob))
测试集上的表现:
def test(pre, cond, testData, testLabel):
# 记录错误个数
errorCnt = 0
# 遍历测试集数据
for i in range(len(testData)):
# 预测值
predict = naive_bayes(pre, cond, testData[i])
# 错误数加一
if predict != testLabel[i]:
errorCnt += 1
# 计算正确率
return 1 - (errorCnt / len(testData))
4. 朴素贝叶斯法总结
朴素贝叶斯法是对贝叶斯法作了很强的假设得到,即条件独立性。因此,在实际运用中,朴素贝叶斯法更常用。基于贝叶斯定理,朴素贝叶斯法的思路是根据先验概率和条件概率计算后验概率。同时,朴素贝叶斯法的估计方法有极大似然估计和贝叶斯估计,通常为了得到有效的结果,采用优化后的贝叶斯估计。
参考
- 统计学习方法/李航著。—2版。—北京:清华大学出版社,2019(2019.6重印).
- https://github.com/Dod-o/Statistical-Learning-Method_Code(朴素贝叶斯代码).