朴素贝叶斯法(Naive Bayes,NB)(结合例子推公式,通俗易懂)

整合一下学习NB的思路与代码,仅代表个人思想。

算法思想

我们先来看一下这名字的来由。朴素贝叶斯,“贝叶斯”即基于贝叶斯定理,“朴素”即作了特征条件独立假设,这两个是它最突出的特点。朴素贝叶斯是一种概率模型,同时也是参数化模型,经常用于监督学习的分类应用中,例如垃圾邮件分类。对于训练集,首先学习输入输出的联合概率分布模型,然后基于此模型,对给出的输入x,利用贝叶斯定理求出后验概率最大的类别y作为输出。

公式推导

先来看看朴素贝叶斯分类器长什么样子:
y = a r g m a x c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y = argmax_{c_k}P(Y=c_k)\prod_{j}P(X^{(j)}=x^{(j)}|Y=c_k) y=argmaxckP(Y=ck)jP(X(j)=x(j)Y=ck)
看不懂很正常,下面结合例子来一步步推出这个公式。

1.问题陈述

设输入空间X为n维向量x的集合,X = {x1,x2,x3…};
每个x由n个特征来描述,xi = {xi(1),xi(2),…,xi(n)};每个特征 x(j) 有 Sj 个取值。
输出空间Y为类标记集合,有k个取值,Y = {c1,c2,…,ck}。
输入训练数据集T = {(x1,y1),(x2,y2),…,(xn,yn)},我们要做的就是用训练集T学习一个模型,然后用该模型计算后验概率分布 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ckX=x),将后验概率最大的类y作为x的类输出。

结合一个例子来讲:

天气x(1)刮风x(2)温度x(3)是否出去玩ck
下雨不去
不刮不去
下雨不刮

用朴素贝叶斯分类器求当输入x = (下雨,不刮,低温)时,是否会出去玩。
在该例子中,输入空间X为3维向量x的集合,X = {x1,x2,x3,x4};
每个x由3个特征来描述,x1 = {x1(1)下雨,x1(2)刮,x1(3)低};x2 = {x2(1)晴,x2(2)不刮,x2(3)高}。
特征x(1)有S1=(下雨,晴)2个取值;特征x(2)有S2=(刮,不刮)2个取值;特征x(3)有S3=(低,中,高)3个取值。
输出空间Y有2个取值,Y = {c1去,c2不去}。
输入训练数据集T = {(x1,y1),(x2,y2),(x3,y3),(x4,y4)}

2.先验概率分布

先验概率分布是得到类ck的概率,在这里用极大似然估计法来估计:
P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K ( 2.1 ) P(Y=c_k)=\frac{\sum_{i=1}^{N}I(y_i=c_k)}{N},k=1,2,...,K \tag{\color{red}{2.1}} P(Y=ck)=Ni=1NI(yi=ck)k=1,2,...,K(2.1)
其中N为样本总个数,当指示函数 I ( y i = c k ) I(y_i=c_k) I(yi=ck)括号内的条件成立时, I ( y i = c k ) = 1 I(y_i=c_k)=1 I(yi=ck)=1,否则为0。

得到类c1=不去玩的概率 P ( Y = c 1 ) = 1 2 P(Y=c_1)=\frac{1}{2} P(Y=c1)=21
得到类c2=去玩的概率 P ( Y = c 2 ) = 1 2 P(Y=c_2)=\frac{1}{2} P(Y=c2)=21
因为在四个样本中有两个不去和两个去,这种靠数个数来计算概率的方法就是极大似然估计。当样本数量足够多时,极大似然估计很好用,样本数量少时就会有失准确性。

3.条件概率分布

假设各个特征之间都是相互独立的(这是一个较强的假设,朴素贝叶斯的“朴素”就是因为这个假设,此假设牺牲了一定的准确率,却让计算变得很简单),那么条件概率分布为Y=ck时,X=x的概率:
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , X ( 2 ) = x ( 2 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) ∣ Y = c k ) ∗ P ( X ( 2 ) = x ( 2 ) ∣ Y = c k ) ∗ . . . ∗ P ( X ( n ) = x ( n ) ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ( 3.1 ) \begin{aligned} P(X=x|Y=c_k) &=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k)\\ &=P(X^{(1)}=x^{(1)}|Y=c_k)*P(X^{(2)}=x^{(2)}|Y=c_k)*...*P(X^{(n)}=x^{(n)}|Y=c_k)\\ &=\prod_{j=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_k) \end{aligned} \tag{\color{red}{3.1}} P(X=xY=ck)=P(X(1)=x(1),X(2)=x(2),...,X(n)=x(n)Y=ck)=P(X(1)=x(1)Y=ck)P(X(2)=x(2)Y=ck)...P(X(n)=x(n)Y=ck)=j=1nP(X(j)=x(j)Y=ck)(3.1)
在这里也用极大似然估计法来估计条件概率 P ( X ( 1 ) = x ( 1 ) ∣ Y = c k ) P(X^{(1)}=x^{(1)}|Y=c_k) P(X(1)=x(1)Y=ck)
P ( X ( 1 ) = x ( 1 ) ∣ Y = c k ) = ∑ i = 1 N I ( X i ( 1 ) = x ( 1 ) , y i = c k ) ∑ i = 1 N I ( y i = c k ) ( 3.2 ) P(X^{(1)}=x^{(1)}|Y=c_k)=\frac{\sum_{i=1}^{N}I(X_i^{(1)}=x^{(1)},y_i=c_k)}{\sum_{i=1}^{N}I(y_i=c_k)} \tag{\color{red}{3.2}} P(X(1)=x(1)Y=ck)=i=1NI(yi=ck)i=1NI(Xi(1)=x(1),yi=ck)(3.2)
其中N为样本总个数,当指示函数 I ( y i = c k ) I(y_i=c_k) I(yi=ck)括号内的条件成立时, I ( y i = c k ) = 1 I(y_i=c_k)=1 I(yi=ck)=1,否则为0;当 I ( X i ( 1 ) = x ( 1 ) , y i = c k ) I(X_i^{(1)}=x^{(1)},y_i=c_k) I(Xi(1)=x(1),yi=ck)括号内的两个条件都成立时为1,否则为0;最后累加起来就相当于在数个数

当假设各个特征之间相互独立时,相当于假设天气,温度和刮风之间互不影响(其实在正常生活中,天气的好坏会影响温度的,也就是说在现实问题中毫无关系的特征几乎不存在)。
( 3.2 ) \color{red}{(3.2)} (3.2)得x(1)=下雨时,y=去的概率:
P ( x ( 1 ) = 下 雨 ∣ Y = 去 ) = ∑ i = 1 4 I ( x ( 1 ) = 下 雨 , y i = 去 ) = 1 ∑ i = 1 4 I ( y i = 去 ) = 2 P(x^{(1)}=下雨|Y=去)=\frac{\sum_{i=1}^{4}I(x^{(1)}=下雨,y_i=去)=1}{\sum_{i=1}^{4}I(y_i=去)=2} P(x(1)=Y=)=i=14I(yi=)=2i=14I(x(1)=yi=)=1
那么当Y=c1去时,由 ( 3.1 ) \color{red}{(3.1)} (3.1)得x = (下雨,不刮,低温)概率为:
P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 去 ) = P ( x ( 1 ) = 下 雨 , x ( 2 ) = 不 刮 , x ( 3 ) = 低 温 ∣ Y = 去 ) = P ( x ( 1 ) = 下 雨 ∣ Y = 去 ) ∗ P ( x ( 2 ) = 不 刮 ∣ Y = 去 ) ∗ P ( x ( 3 ) = 低 温 ∣ Y = 去 ) = 1 2 ∗ 1 2 ∗ 0 = 0 ( 3.3 ) \begin{aligned} P(x = (下雨,不刮,低温)|Y=去) &=P(x^{(1)}=下雨,x^{(2)}=不刮,x^{(3)}=低温|Y=去)\\ &=P(x^{(1)}=下雨|Y=去)*P(x^{(2)}=不刮|Y=去)*P(x^{(3)}=低温|Y=去)\\ &=\frac{1}{2}*\frac{1}{2}*0\\ &=0 \end{aligned} \tag{\color{red}{3.3}} P(x=()Y=)=P(x(1)=,x(2)=,x(3)=Y=)=P(x(1)=Y=)P(x(2)=Y=)P(x(3)=Y=)=21210=0(3.3)
当Y=c2不去时,x = (下雨,不刮,低温)概率为:
P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 不 去 ) = P ( x ( 1 ) = 下 雨 , x ( 2 ) = 不 刮 , x ( 3 ) = 低 温 ∣ Y = 不 去 ) = P ( x ( 1 ) = 下 雨 ∣ Y = 不 去 ) ∗ P ( x ( 2 ) = 不 刮 ∣ Y = 不 去 ) ∗ P ( x ( 3 ) = 低 温 ∣ Y = 不 去 ) = 1 2 ∗ 1 2 ∗ 1 2 = 1 8 ( 3.4 ) \begin{aligned} P(x = (下雨,不刮,低温)|Y=不去) &=P(x^{(1)}=下雨,x^{(2)}=不刮,x^{(3)}=低温|Y=不去)\\ &=P(x^{(1)}=下雨|Y=不去)*P(x^{(2)}=不刮|Y=不去)*P(x^{(3)}=低温|Y=不去)\\ &=\frac{1}{2}*\frac{1}{2}*\frac{1}{2}\\ &=\frac{1}{8} \end{aligned} \tag{\color{red}{3.4}} P(x=()Y=)=P(x(1)=,x(2)=,x(3)=Y=)=P(x(1)=Y=)P(x(2)=Y=)P(x(3)=Y=)=212121=81(3.4)

4.输入为x的概率

接下来还需要计算输入为x = {x(1),x(2),…,x(n)} 的概率。
输入为x的概率 P ( X = x ) P(X=x) P(X=x)就是x为类c1的概率,x为类c2的概率…x为类ck的概率相加起来:
P ( X = x ) = P ( Y = c 1 ) ∗ P ( X = x ∣ Y = c 1 ) + P ( Y = c 2 ) ∗ P ( X = x ∣ Y = c 2 ) + . . . + P ( Y = c k ) ∗ P ( X = x ∣ Y = c k ) = ∑ k = 1 K P ( Y = c k ) ∗ P ( X = x ∣ Y = c k ) \begin{aligned} P(X=x) &=P(Y=c_1)*P(X=x|Y=c_1)+P(Y=c_2)*P(X=x|Y=c_2)+...+P(Y=c_k)*P(X=x|Y=c_k)\\ &=\sum_{k=1}^{K}{P(Y=c_k)*P(X=x|Y=c_k)} \end{aligned} P(X=x)=P(Y=c1)P(X=xY=c1)+P(Y=c2)P(X=xY=c2)+...+P(Y=ck)P(X=xY=ck)=k=1KP(Y=ck)P(X=xY=ck)

计算x=(下雨,不刮,低温)的概率,由步骤2得 P ( Y = c 1 ) = P ( Y = c 2 ) = 1 2 P(Y=c_1)=P(Y=c_2)=\frac{1}{2} P(Y=c1)=P(Y=c2)=21
由式 ( 3.3 ) \color{red}{(3.3)} (3.3) ( 3.4 ) \color{red}{(3.4)} (3.4)得: P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 去 ) = 0 P(x = (下雨,不刮,低温)|Y=去)=0 P(x=()Y=)=0
P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 不 去 ) = 1 8 P(x = (下雨,不刮,低温)|Y=不去)=\frac{1}{8} P(x=()Y=)=81
故得输入为x = (下雨,不刮,低温)的概率为:
P ( x = ( 下 雨 , 不 刮 , 低 温 ) ) = P ( Y = 去 ) ∗ P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 去 ) + P ( Y = 不 去 ) ∗ P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 不 去 ) = 1 2 ∗ 1 8 + 1 2 ∗ 0 = 1 16 \begin{aligned} P(x = (下雨,不刮,低温)) &=P(Y=去)*P(x = (下雨,不刮,低温)|Y=去)+P(Y=不去)*P(x = (下雨,不刮,低温)|Y=不去)\\ &=\frac{1}{2}*\frac{1}{8}+\frac{1}{2}*0\\ &=\frac{1}{16} \end{aligned} P(x=())=P(Y=)P(x=()Y=)+P(Y=)P(x=()Y=)=2181+210=161

5.用贝叶斯定理求后验概率

贝叶斯定理:
P ( A ∣ B ) = P ( B ∣ A ) ∗ P ( A ) P ( B ) P(A|B)=\frac{P(B|A)*P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)
在这里,Y=ck就是A,X=x就是B,那么就得到了计算后验概率的公式:
P ( Y = c k ∣ X = x ) = P ( X = x ∣ Y = c k ) ∗ P ( Y = c k ) P ( X = x ) ( 5.1 ) P(Y=c_k|X=x)=\frac{P(X=x|Y=c_k)*P(Y=c_k)}{P(X=x)} \tag{\color{red}{5.1}} P(Y=ckX=x)=P(X=x)P(X=xY=ck)P(Y=ck)(5.1)

我们已经在步骤2,3中计算出了分子,步骤4中计算出了分母,所以将步骤2,3,4中的结果代入式 ( 5.1 ) \color{red}{(5.1)} (5.1)得:
输入x = (下雨,不刮,低温)时,输出Y=去的后验概率为:
P ( Y = 去 ∣ x = ( 下 雨 , 不 刮 , 低 温 ) ) = P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 去 ) ∗ P ( Y = 去 ) P ( x = ( 下 雨 , 不 刮 , 低 温 ) ) = 0 ∗ 1 2 1 16 = 0 ( 5.2 ) \begin{aligned} P(Y=去|x = (下雨,不刮,低温)) &=\frac{P(x = (下雨,不刮,低温)|Y=去)*P(Y=去)}{P(x = (下雨,不刮,低温))}\\ &=\frac{0*\frac{1}{2}}{\frac{1}{16}}\\ &=0 \end{aligned} \tag{\color{red}{5.2}} P(Y=x=())=P(x=())P(x=()Y=)P(Y=)=161021=0(5.2)
输入x = (下雨,不刮,低温)时,输出Y=不去的后验概率为:
P ( Y = 不 去 ∣ x = ( 下 雨 , 不 刮 , 低 温 ) ) = P ( x = ( 下 雨 , 不 刮 , 低 温 ) ∣ Y = 不 去 ) ∗ P ( Y = 不 去 ) P ( x = ( 下 雨 , 不 刮 , 低 温 ) ) = 1 8 ∗ 1 2 1 16 = 1 ( 5.3 ) \begin{aligned} P(Y=不去|x = (下雨,不刮,低温)) &=\frac{P(x = (下雨,不刮,低温)|Y=不去)*P(Y=不去)}{P(x = (下雨,不刮,低温))}\\ &=\frac{\frac{1}{8}*\frac{1}{2}}{\frac{1}{16}}\\ &=1 \end{aligned} \tag{\color{red}{5.3}} P(Y=x=())=P(x=())P(x=()Y=)P(Y=)=1618121=1(5.3)

7.得到答案

朴素贝叶斯分类器将最大的后验概率对应的类ck作为x的类输出,由式 ( 5.1 ) \color{red}{(5.1)} (5.1)得:
y = a r g m a x c k P ( Y = c k ∣ X = x ) y = argmax_{c_k}P(Y=c_k|X=x) y=argmaxckP(Y=ckX=x)

我们已经由式 ( 5.2 ) \color{red}{(5.2)} (5.2) ( 5.3 ) \color{red}{(5.3)} (5.3)得到了x对应的每个类的后验概率,只需最后一步比较大小,将最大的找出来,就得到了答案。
y = a r g m a x c k P ( Y = c k ∣ X = x ) = a r g m a x c k { P ( Y = 去 ∣ x = ( 下 雨 , 不 刮 , 低 温 ) ) , P ( Y = 不 去 ∣ x = ( 下 雨 , 不 刮 , 低 温 ) ) } = a r g m a x c k { 0 , 1 } = c 2 不 去 \begin{aligned} y &= argmax_{c_k}P(Y=c_k|X=x)\\ &=argmax_{c_k}\{P(Y=去|x = (下雨,不刮,低温)),P(Y=不去|x = (下雨,不刮,低温))\}\\ &=argmax_{c_k}\{0,1\}\\ &=c_2不去 \end{aligned} y=argmaxckP(Y=ckX=x)=argmaxck{P(Y=x=()),P(Y=x=())}=argmaxck{0,1}=c2
所以当输入x = (下雨,不刮,低温)时,不会出去玩。

8.简化计算

在计算后验概率的公式 ( 5.1 ) \color{red}{(5.1)} (5.1)中可以发现,对于不同类的对应后验概率的计算中,分母都是一样的,而我们最终只比较后验概率的大小,所以只需比较分子的大小就可以了,去掉分母并不影响最后的结果,所以最终的朴素贝叶斯分类器公式为:
y = a r g m a x c k P ( X = x ∣ Y = c k ) ∗ P ( Y = c k ) = a r g m a x c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) \begin{aligned} y &=argmax_{c_k}P(X=x|Y=c_k)*P(Y=c_k)\\ &=argmax_{c_k}P(Y=c_k)\prod_{j}P(X^{(j)}=x^{(j)}|Y=c_k) \end{aligned} y=argmaxckP(X=xY=ck)P(Y=ck)=argmaxckP(Y=ck)jP(X(j)=x(j)Y=ck)

9.Laplace平滑

首先在步骤1中我们已经说过,每个x由n个特征来描述,x1 = {x1(1),x1(2),…,x1(n)};每个特征x(j)有Sj个取值。那么所有可能取得的x个数就为 ∏ j = 1 n S j \prod_{j=1}^{n}S_j j=1nSj。比如在该例中S1=2;S2=2;S3=3。所以所有可能取得的x个数就为2×2×3=12。也就是说, 每个输入x的可能性都是 1 12 \frac{1}{12} 121

但在步骤4中我们求得输入为x = (下雨,不刮,低温)的概率却为 1 16 \frac{1}{16} 161,这是为什么呢?

因为在计算过程中,一直使用的是极大似然估计,而极大似然估计可能会出现所要估计的概率值为0的情况,比如在上例中,低温的两个样本都不去玩,导致 P ( x ( 3 ) = 低 温 ∣ Y = 去 ) P(x^{(3)}=低温|Y=去) P(x(3)=Y=)的概率为0,进而导致后续计算 P ( Y = 去 ∣ x = ( 下 雨 , 不 刮 , 低 温 ) ) P(Y=去|x = (下雨,不刮,低温)) P(Y=x=())也是0。这时就会影响到后验概率的计算结果,使分类产生偏差,因为或许在更多的样本中会出现低温时也出去玩的情况。

解决这个问题的方法就是采用贝叶斯估计

具体地,在分子分母上加一项正数 λ > 0 \lambda>0 λ>0。一般情况下,常取 λ = 1 \lambda=1 λ=1,这时称为拉普拉斯平滑

采用贝叶斯估计而非极大似然估计(式 ( 3.2 ) \color{red}{(3.2)} (3.2))的条件概率如下:
P λ ( X ( 1 ) = x ( 1 ) ∣ Y = c k ) = ∑ i = 1 N I ( X i ( 1 ) = x ( 1 ) , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j ∗ λ P_\lambda(X^{(1)}=x^{(1)}|Y=c_k)=\frac{\sum_{i=1}^{N}I(X_i^{(1)}=x^{(1)},y_i=c_k)+\lambda}{\sum_{i=1}^{N}I(y_i=c_k)+S_j*\lambda} Pλ(X(1)=x(1)Y=ck)=i=1NI(yi=ck)+Sjλi=1NI(Xi(1)=x(1),yi=ck)+λ

λ = 1 \lambda=1 λ=1,由上式得x(1)=下雨时,y=去的概率:
P λ ( x ( 1 ) = 下 雨 ∣ Y = 去 ) = ∑ i = 1 4 I ( x ( 1 ) = 下 雨 , y i = 去 ) + 1 ∑ i = 1 4 I ( y i = 去 ) + 2 ∗ 1 = 1 2 P_\lambda(x^{(1)}=下雨|Y=去)=\frac{\sum_{i=1}^{4}I(x^{(1)}=下雨,y_i=去)+1}{\sum_{i=1}^{4}I(y_i=去)+2*1}=\frac{1}{2} Pλ(x(1)=Y=)=i=14I(yi=)+21i=14I(x(1)=yi=)+1=21
可以看到,当条件概率不为0时,贝叶斯估计的结果与极大似然估计是一致的,但当条件概率恰好为0时,贝叶斯估计的作用就体现了出来,消除了0造成的误差。

用NB分类iris(python实现)

pycharm+python3.7.4,完整代码如下:

# file-settings-python interpreter导包
# 导入科学计算工具
import numpy as np
# 导入鸢尾花数据集
from sklearn.datasets import load_iris
# 导入朴素贝叶斯
from sklearn import naive_bayes

# 加载鸢尾花数据集
iris = load_iris()
# 提取数据
trainX = iris.data
# 提取标签
trainY = iris.target
# 建立高斯分布的朴素贝叶斯模型
clf=naive_bayes.GaussianNB()  #高斯分布,没有参数
# 建立多项式分布的朴素贝叶斯模型
# clf=naive_bayes.MultinomialNB()  #多项式分布

# 训练模型
clf.fit(trainX,trainY)
# 输出准确率
print("准确率:" + str(clf.score(trainX,trainY)))

实验结果:

准确率:0.96
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值