(三)统计学习方法 | 朴素贝叶斯法


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(YX)=P(X)P(X,Y), P(XY)=P(Y)P(X,Y)

1.2 基本方法

设输入空间 X ⊆ R n {\mathcal X}\subseteq {\bold R}^n XRn 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} xX,输出为类标记 y ∈ Y y\in{\mathcal Y} yY 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=xY=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=xY=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=1nSj。因此,朴素贝叶斯对条件概率作了条件独立性的假设。具体的假设条件为: 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=xY=ck)=P(X(1)=x(1),...,X(n)=x(n)Y=ck), k=1,2,...,K=j=1nP(X(j)=x(j)Y=ck)(2)

在使用朴素贝叶斯法分类时,对于给定的输入 x x x,通过学习到的模型计算后验概率分布 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ckX=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=ckX=x)=kP(X=xY=ck)P(Y=ck)P(X=xY=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=ckX=x)=kP(Y=ck)jP(X(j)=x(j)Y=ck)P(Y=ck)jP(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)=ckargmaxkP(Y=ck)jP(X(j)=x(j)Y=ck)P(Y=ck)jP(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)jP(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=1NI(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)=ajlY=ck)=i=1NI(yi=ck)i=1NI(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=1NI(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)=ajlY=ck)=i=1NI(yi=ck)i=1NI(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)jP(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)jP(X(j)=x(j)Y=ck).

例题 训练数据如下:

123456789101112131415
X ( 1 ) X^{(1)} X(1)111112222233333
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-111-1-1-11111111-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)=1Y=1)=92, P(X(1)=2Y=1)=93, P(X(1)=3Y=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)=SY=1)=91, P(X(2)=MY=1)=94, P(X(2)=LY=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)=1Y=1)=63, P(X(1)=2Y=1)=62, P(X(1)=3Y=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)=SY=1)=64, P(X(2)=MY=1)=62, P(X(2)=LY=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)=2Y=1)P(X(2)=SY=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)=2Y=1)P(X(2)=SY=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)=ajlY=ck)=i=1NI(yi=ck)+Sjλi=1NI(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)=ajlY=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=1SjP(X(j)=ajlY=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=1NI(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)=1Y=1)=123, P(X(1)=2Y=1)=124, P(X(1)=3Y=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)=SY=1)=122, P(X(2)=MY=1)=125, P(X(2)=LY=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)=1Y=1)=94, P(X(1)=2Y=1)=93, P(X(1)=3Y=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)=SY=1)=94, P(X(2)=MY=1)=93, P(X(2)=LY=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)=2Y=1)P(X(2)=SY=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)=2Y=1)P(X(2)=SY=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. 朴素贝叶斯法总结

朴素贝叶斯法是对贝叶斯法作了很强的假设得到,即条件独立性。因此,在实际运用中,朴素贝叶斯法更常用。基于贝叶斯定理,朴素贝叶斯法的思路是根据先验概率和条件概率计算后验概率。同时,朴素贝叶斯法的估计方法有极大似然估计和贝叶斯估计,通常为了得到有效的结果,采用优化后的贝叶斯估计。


参考

  1. 统计学习方法/李航著。—2版。—北京:清华大学出版社,2019(2019.6重印).
  2. https://github.com/Dod-o/Statistical-Learning-Method_Code(朴素贝叶斯代码).


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值