《统计学习方法》——朴素贝叶斯法

article/2025/7/20 1:37:10

引言

朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法。
这一章需要大量的概率论知识,忘记了的同学建议先参阅人工智能数学基础之概率论。

朴素贝叶斯法的学习与分类

基本方法

设输入空间 X ⊆ R n \mathcal{X} \subseteq R^n XRn n n n维向量的集合,输出空间为类标记集合 Y = { c 1 , c 2 , ⋯ , c K } \mathcal{Y} = \{c_1,c_2,\cdots,c_K\} Y={c1,c2,,cK}。输入为特征向量 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的联合概率分布。

训练数据集由 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 (4.1) P(Y = c_K) ,\ k = 1,2,\cdots, K \tag {4.1} P(Y=cK), k=1,2,,K(4.1)

先验概率是通过经验来判断事情发生的概率,通常是可以直接得到的,比如这里可以用样本中某个类的样本数除以总样本数。

条件概率分布

P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) ∣ Y = c k ) , k = 1 , 2 , ⋯ , K (4.2) P(X=x|Y=c_k) = P(X^{(1)} = x^{(1)},\cdots, X^{(n)}=x^{(n)} | Y=c_k), \ k = 1,2, \cdots, K \tag{4.2} P(X=xY=ck)=P(X(1)=x(1),,X(n)=x(n)Y=ck), k=1,2,,K(4.2)

于是学习到联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)

这里要复习一下条件概率公式,设 A , B A,B A,B是两个事件,且 P ( A ) > 0 P(A)>0 P(A)>0,则称

P ( B ∣ A ) = P ( A B ) P ( A ) P(B∣A) = \frac{P(AB)}{P(A)} P(BA)=P(A)P(AB)
为在事件 A A A发生的条件下,事件 B B B的条件概率。
P ( A B ) P(AB) P(AB)表示 A , B A,B A,B这两个事件同时发生的概率。
P ( A , B ) , P ( A B ) , P ( A ⋂ B ) P(A,B),P(AB),P(A\bigcap B) P(A,B),P(AB),P(AB)三者说的是同一件事情

事件 A , B A,B A,B独立,有 P ( A B ) = P ( A ) P ( B ) P(AB)=P(A)P(B) P(AB)=P(A)P(B)
摘自人工智能数学基础之概率论

那么 P ( X , Y ) = P ( X = x ∣ Y = c k ) ⋅ P ( Y = c K ) P(X,Y) = P(X=x|Y=c_k) \cdot P(Y = c_K) P(X,Y)=P(X=xY=ck)P(Y=cK)

朴素贝叶斯法对条件概率分布作了条件独立的假设,这就是朴素的意思。具体地,条件独立性假设是

P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) (4.3) P(X=x|Y=c_k) = P(X^{(1)} = x^{(1)},\cdots, X^{(n)}=x^{(n)} | Y=c_k) = \prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k) \tag {4.3} P(X=xY=ck)=P(X(1)=x(1),,X(n)=x(n)Y=ck)=j=1nP(X(j)=x(j)Y=ck)(4.3)

朴素说的是 X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) X^{(1)} = x^{(1)},\cdots, X^{(n)}=x^{(n)} X(1)=x(1),,X(n)=x(n)相互独立,所以就有了上面的公式。

朴素贝叶斯实际上学习到生成数据的机制,属于生成模型。条件独立假设是说用于分类的特征在类确定的条件下是条件独立的。这一假设使朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。

朴素贝叶斯法分类时,对给定的输入 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 ) (4.4) P(Y=c_k|X=x) = \frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum_{k} P(X=x|Y=c_k)P(Y=c_k)} \tag{4.4} P(Y=ckX=x)=kP(X=xY=ck)P(Y=ck)P(X=xY=ck)P(Y=ck)(4.4)

上式的分母用到了全概率公式:
如果事件 A 1 , A 2 , ⋯ , A n A_1,A_2,\cdots,A_n A1,A2,,An是一个完备事件组(一个事件发生的所有可能性都在这里面),并且都有正概率,则有
P ( B ) = P ( B ∣ A 1 ) P ( A 1 ) + P ( B ∣ A 2 ) P ( A 2 ) + ⋯ + P ( B ∣ A n ) P ( A n ) = ∑ i = 1 n P ( A i ) P ( B ∣ A i ) P(B) = P(B|A_1)P(A_1) + P(B|A_2)P(A_2) + \cdots + P(B|A_n)P(A_n) = \sum_{i=1}^nP(A_i)P(B|A_i) P(B)=P(BA1)P(A1)+P(BA2)P(A2)++P(BAn)P(An)=i=1nP(Ai)P(BAi)
摘自人工智能数学基础之概率论

这里 P ( Y = c k ) , k = 1 , 2 , ⋯ , K P(Y = c_k) ,\ k = 1,2,\cdots, K P(Y=ck), k=1,2,,K就是一个完备事件组,注意分母里的 P ( Y = c k ) P(Y = c_k) P(Y=ck)属于求和公式里,不能和分子里的 P ( Y = c k ) P(Y = c_k) P(Y=ck)约掉。

  • P ( Y = c k ) P(Y=c_k) P(Y=ck)是先验概率。
  • P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ckX=x)是类 c k c_k ck在给定 x x x情况下的后验概率,后验概率就是发生结果之后,推测原因的概率。
  • P ( X = x ∣ Y = c k ) P(X=x∣Y=c_k) P(X=xY=ck)是条件概率,也就是在类别 c k c_k ck的条件下,出现样本x的可能性。

将式(4.3)代入式(4.4),有

P ( Y = c k ∣ X = x ) = P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) (4.5) P(Y=c_k|X=x) = \frac{P(Y=c_k)\prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k)}{\sum_{k}P(Y=c_k) \prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k)} \tag{4.5} P(Y=ckX=x)=kP(Y=ck)j=1nP(X(j)=x(j)Y=ck)P(Y=ck)j=1nP(X(j)=x(j)Y=ck)(4.5)

这是朴素贝叶斯法分类的基本公式。求解在给定 X = x X=x X=x的情况下,各个类别的出现的概率,哪个概率较大就认为给定的 x x x属于哪个类别。朴素贝叶斯分类器可表示为:

y = f ( x ) = arg ⁡ max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) (4.6) y = f(x) = \arg\,\max_{c_k}\frac{P(Y=c_k)\prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k)}{\sum_{k}P(Y=c_k) \prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k)} \tag{4.6} y=f(x)=argckmaxkP(Y=ck)j=1nP(X(j)=x(j)Y=ck)P(Y=ck)j=1nP(X(j)=x(j)Y=ck)(4.6)

在上式中分母对所有 c k c_k ck都是相同的,即对于给定的数据集 X X X,分母就是一个常量,所以可以看成最大化:

y = f ( x ) = arg ⁡ max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) (4.7) y = f(x) = \arg\,\max_{c_k}P(Y=c_k)\prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k) \tag{4.7} y=f(x)=argckmaxP(Y=ck)j=1nP(X(j)=x(j)Y=ck)(4.7)

后验概率最大化的含义

朴素贝叶斯法将实例分到后验概率最大的类中。等价于期望风险最小化,假设选择0-1损失函数:

L ( Y , f ( X ) ) = { 1 if  Y ≠ f ( X ) 0 if  Y = f ( X ) L(Y,f(X)) = \begin{cases} 1 & \text{if } Y \neq f(X) \\ 0 & \text{if } Y = f(X) \end{cases} L(Y,f(X))={10if Y=f(X)if Y=f(X)

损失函数期望公式 R e x p ( f ) = E p [ L ( Y , f ( X ) ) ] = ∫ X × Y L ( y , f ( x ) ) P ( x , y ) d x d y R_{exp}(f) = E_p[L(Y,f(X))] = \int_{\mathcal X \times \mathcal Y} L(y,f(x))P(x,y)dxdy Rexp(f)=Ep[L(Y,f(X))]=X×YL(y,f(x))P(x,y)dxdy

上面 f ( X ) f(X) f(X)是分类决策函数。这时,期望风险函数为

R e x p ( f ) = E [ L ( Y , f ( X ) ) ] = ∫ X × Y L ( y , f ( x ) ) P ( x , y ) d x d y = ∫ X × Y L ( y , f ( x ) ) P ( y ∣ x ) p ( x ) d x d y = ∫ X ∫ Y L ( y , f ( x ) ) P ( y ∣ x ) p ( x ) d x d y = ∫ X ( ∫ Y L ( y , f ( x ) ) P ( y ∣ x ) d y ) p ( x ) d x \begin{aligned} R_{exp}(f) &= E[L(Y,f(X))] \\ &= \int_{\mathcal X \times \mathcal Y} L(y,f(x))P(x,y)dxdy \\ &= \int_{\mathcal X \times \mathcal Y}L(y,f(x))P(y|x)p(x)dxdy \\ &= \int_{\mathcal X} \int_{\mathcal Y} L(y,f(x))P(y|x)p(x)dxdy \\ &= \int_{\mathcal X} \left( \int_{\mathcal Y} L(y,f(x))P(y|x)dy \right) p(x) dx \end{aligned} Rexp(f)=E[L(Y,f(X))]=X×YL(y,f(x))P(x,y)dxdy=X×YL(y,f(x))P(yx)p(x)dxdy=XYL(y,f(x))P(yx)p(x)dxdy=X(YL(y,f(x))P(yx)dy)p(x)dx

要使期望风险最小,就是要对于任意 X = x X=x X=x P ( X = x ) P(X=x) P(X=x)为常数情况下上面括号内的积分最小。

对于离散型随机变量,括号内的式子可以写成:

∑ k = 1 K L ( c k , f ( x ) ) P ( c k ∣ x ) \sum_{k=1}^K L(c_k,f(x))P(c_k|x) k=1KL(ck,f(x))P(ckx)

为了使期望风险最小化,只需要 X = x X=x X=x中每个 x x x都取最小值,即逐个最小化,得:
f ( x ) = arg ⁡ min ⁡ y ∈ Y ∑ k = 1 K L ( c k , y ) P ( c k ∣ X = x ) f(x) = \arg \, \min_{y \in \mathcal Y} \sum_{k=1}^K L(c_k,y)P(c_k|X=x) f(x)=argyYmink=1KL(ck,y)P(ckX=x)

对于 y = c k y=c_k y=ck x x x其损失值为0,因此我们只要考虑 y ≠ c k y \neq c_k y=ck,其损失值为 1 1 1,因此下面可以化简:

f ( x ) = arg ⁡ min ⁡ y ∈ Y ∑ k = 1 K L ( c k , y ) P ( c k ∣ X = x ) = arg ⁡ min ⁡ y ∈ Y ∑ k = 1 K P ( y ≠ c k ∣ X = x ) = arg ⁡ min ⁡ y ∈ Y ( 1 − P ( y = c k ∣ X = x ) ) = arg ⁡ max ⁡ y ∈ Y P ( y = c k ∣ X = x ) \begin{aligned} f(x) &= \arg \, \min_{y \in \mathcal Y} \sum_{k=1}^K L(c_k,y)P(c_k|X=x) \\ &= \arg \, \min_{y \in \mathcal Y} \sum_{k=1}^K P(y \neq c_k | X=x) \\ &= \arg \, \min_{y \in \mathcal Y} (1 -P(y=c_k|X=x)) \\ &= \arg \, \max_{y \in \mathcal Y} P(y=c_k|X=x) \end{aligned} f(x)=argyYmink=1KL(ck,y)P(ckX=x)=argyYmink=1KP(y=ckX=x)=argyYmin(1P(y=ckX=x))=argyYmaxP(y=ckX=x)

因此,根据期望风险最小化准则就得到了后验概率最大化准则:
f ( x ) = arg ⁡ max ⁡ c k P ( c k ∣ X = x ) f(x) = \arg \, \max_{c_k} P(c_k|X=x) f(x)=argckmaxP(ckX=x)

也就是朴素贝叶斯法的原理。

朴素贝叶斯法的参数估计

极大似然估计

在朴素贝叶斯法中,学习意味着估计 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 (4.8) P(Y=c_k) = \frac{\sum_{i=1}^N I(y_i=c_k)}{N} , \ k = 1,2,\cdots, K \tag{4.8} P(Y=ck)=Ni=1NI(yi=ck), k=1,2,,K(4.8)

就是用类别 c k c_k ck出现的次数除以样本总数来估计 P ( Y = c k ) P(Y=c_k) P(Y=ck)

设第 j j j个特征 x ( j ) x^{(j)} x(j) 可能取值的集合为 { a j 1 , a j 2 , ⋯ , a j S j } \{a_{j1} ,a_{j2},\cdots,a_{jS_j}\} {aj1,aj2,,ajSj},条件概率 P ( X ( j ) = a j l ∣ Y = c k ) P(X^{(j)} = a_{jl} | Y =c_k) P(X(j)=ajlY=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 (4.9) P(X^{(j)} = a_{jl} | Y =c_k) = \frac{\sum_{i=1}^N I(x^{(j)}_i = a_{jl},y_i=c_k)}{\sum_{i=1}^N I(y_i = c_k)} \tag{4.9} \\ j=1,2,\cdots, n; l =1,2,\cdots,S_j; k= 1,2,\cdots,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(4.9)

式中, x i ( j ) x^{(j)}_i xi(j) 是第 i i i个样本的第 j j j个特征; a j l a_{jl} ajl 是第 j j j个特征可能取的第 l l l个值; I I I为指示函数。

说的是给定类别 c k c_k ck的条件下,第 j j j个特征为 a j l a_{jl} ajl的概率。用类别 c k c_k ck中第 j j j个特征为 a j l a_{jl} ajl的数量除以,类别 c k c_k ck的数量。

学习与分类算法

下面给出朴素贝叶斯法的学习与分类算法。

输入:训练数据 T T T
输出:实例 x x x的分类。

  1. 计算先验概率及条件概率
    P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , 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(Y=c_k) = \frac{\sum_{i=1}^N I(y_i = c_k)}{N}, \ k = 1,2,\cdots, K \\ P(X^{(j)} = a_{jl} | Y =c_k) = \frac{\sum_{i=1}^N I(x^{(j)}_i = a_{jl},y_i=c_k)}{\sum_{i=1}^N I(y_i = c_k)} \\ j=1,2,\cdots, n; l =1,2,\cdots,S_j; k= 1,2,\cdots,K P(Y=ck)=Ni=1NI(yi=ck), k=1,2,,KP(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 = ( x ( 1 ) , x ( 2 ) , ⋯ , x ( n ) ) T x = (x^{(1)},x^{(2)},\cdots, x^{(n)})^T x=(x(1),x(2),,x(n))T,计算

P ( Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , ⋯ , K P(Y=c_k) = \prod _{j=1}^n P(X^{(j)} = x^{(j)} | Y= c_k), \ k=1,2,\cdots, K P(Y=ck)=j=1nP(X(j)=x(j)Y=ck), k=1,2,,K

  1. 确定实例 x x x的类

y = arg ⁡ max ⁡ c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) y = \arg \, \max_{c_k} P(Y=c_k) \prod_{j=1}^n P(X^{(j)} = x^{(j)} | Y = c_k) y=argckmaxP(Y=ck)j=1nP(X(j)=x(j)Y=ck)

就是公式 ( 4.7 ) (4.7) (4.7)

下面用一个例子来应用下上面的算法,本书最厉害的地方就是例题很多,每个例题都很详细。通过例题可以理解上面的公式。

在这里插入图片描述

这里 Y Y Y有两个取值,我们分别计算这两个取值的先验概率。

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

总共有15个样本,其中9个类别为 1 1 1,6个类别为 − 1 -1 1

再计算条件概率,这里为了简单只计算用得到的条件概率。

我们要计算 X = ( 2 , S ) T X=(2,S)^T X=(2,S)T的类标记,根据公式 ( 4.7 ) (4.7) (4.7)(或者根据上面的算法),需要计算 P ( Y = − 1 ) P ( X ( 1 ) = 2 , X ( 2 ) = S ∣ Y = − 1 ) P(Y=-1)P(X^{(1)}=2,X^{(2)}=S|Y=-1) P(Y=1)P(X(1)=2,X(2)=SY=1),根据朴素的定义,即计算 P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1) P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1) 和另一个类 P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1) P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)

下面我们分别计算上午所需的条件概率

P ( X ( 1 ) = 2 ∣ Y = 1 ) = 3 9 P(X^{(1)}=2|Y=1) = \frac{3}{9} P(X(1)=2Y=1)=93 首先 Y = 1 Y=1 Y=1的样本数量有9个,其中特征 X ( 1 ) = 2 X^{(1)}=2 X(1)=2的有3个,因此概率就是 3 9 \frac{3}{9} 93
同理求得 P ( X ( 2 ) = S ∣ Y = 1 ) = 1 9 P(X^{(2)}=S|Y=1) = \frac{1}{9} P(X(2)=SY=1)=91, P ( X ( 1 ) = 2 ∣ Y = − 1 ) = 2 6 P(X^{(1)}=2|Y=-1) =\frac{2}{6} P(X(1)=2Y=1)=62, P ( X ( 2 ) = S ∣ Y = − 1 ) = 3 6 P(X^{(2)}=S|Y=-1) =\frac{3}{6} P(X(2)=SY=1)=63

下面就比较

P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 6 15 × 2 6 × 3 6 = 1 15 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1) = \frac{6}{15} \times \frac{2}{6} \times \frac{3}{6} = \frac{1}{15} P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=156×62×63=151

P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) = 9 15 × 3 9 × 1 9 = 1 45 P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1) =\frac{9}{15} \times \frac{3}{9} \times \frac{1}{9} = \frac{1}{45} P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=159×93×91=451

显然,前者更大,因此 y = − 1 y = -1 y=1

贝叶斯估计

用极大似然估计可能会出现所要估计的概率值为0的情况,假如上面计算 P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1) P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1) P ( X ( 2 ) = S ∣ Y = − 1 ) = 0 P(X^{(2)}=S|Y=-1)=0 P(X(2)=SY=1)=0,那么导致整个计算结果为 0 0 0,就会影响最终判断。

通常是因为某个类别下 X X X取某个特征的数量为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 λ (4.10) P_{\lambda}(X^{(j)}=a_{jl}|Y=c_k) = \frac{\sum_{i=1}^N I(x_i^{(j)} = a_{jl},y_i=c_k) +\lambda}{\sum_{i=1}^N I(y_i=c_k) +S_j\lambda} \tag{4.10} Pλ(X(j)=ajlY=ck)=i=1NI(yi=ck)+Sjλi=1NI(xi(j)=ajl,yi=ck)+λ(4.10)

其中 λ ≥ 0 \lambda \geq 0 λ0,即在计算条件概率时,在 X X X各个取值的次数上加上一个正值 λ \lambda λ,当 λ = 0 \lambda = 0 λ=0时就是极大似然估计,通常 λ = 1 \lambda=1 λ=1,这时称为拉普拉斯平滑。

分母加上 S j S_j Sj λ \lambda λ,保证概率之和为 1 1 1

同样,先验概率的贝叶斯估计是
P λ ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + K λ (4.11) P_\lambda(Y=c_k) = \frac{\sum_{i=1}^N I(y_i = c_k) + \lambda}{N+ K\lambda} \tag{4.11} Pλ(Y=ck)=N+Kλi=1NI(yi=ck)+λ(4.11)

例4.2 问题同例4 . 1,按照拉普拉斯平滑估计概率,即取 λ \lambda λ=1 。

先例出所有的取值, A 1 = { 1 , 2 , 3 } , A 2 = { S , M , L } A_1 = \{1,2, 3\} , A_2 = \{S,M,L\} A1={1,2,3},A2={S,M,L} 和类别 C = { 1 , − 1 } C = \{1 , -1\} C={1,1}

P ( Y = − 1 ) = 6 + 1 15 + 2 = 7 17 P(Y=-1) = \frac{6+1}{15+2} = \frac{7}{17} P(Y=1)=15+26+1=177, P ( Y = 1 ) = 9 + 1 15 + 2 = 10 17 P(Y=1) = \frac{9+1}{15+2} = \frac{10}{17} P(Y=1)=15+29+1=1710

P ( X ( 1 ) = 2 ∣ Y = 1 ) = 3 + 1 9 + 3 = 4 12 P(X^{(1)}=2|Y=1) = \frac{3+1}{9+3} = \frac{4}{12} P(X(1)=2Y=1)=9+33+1=124
同理求得 P ( X ( 2 ) = S ∣ Y = 1 ) = 2 12 P(X^{(2)}=S|Y=1) = \frac{2}{12} P(X(2)=SY=1)=122, P ( X ( 1 ) = 2 ∣ Y = − 1 ) = 3 9 P(X^{(1)}=2|Y=-1) =\frac{3}{9} P(X(1)=2Y=1)=93, P ( X ( 2 ) = S ∣ Y = − 1 ) = 4 9 P(X^{(2)}=S|Y=-1) =\frac{4}{9} P(X(2)=SY=1)=94

比较

P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 7 17 × 3 9 × 4 9 = 28 459 = 0.0610 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1) = \frac{7}{17} \times \frac{3}{9} \times \frac{4}{9} = \frac{28}{459}=0.0610 P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=177×93×94=45928=0.0610

P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) = 10 17 × 4 12 × 2 12 = 5 153 = 0.0327 P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1) =\frac{10}{17} \times \frac{4}{12} \times \frac{2}{12} = \frac{5}{153} = 0.0327 P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=1710×124×122=1535=0.0327

代码实现

import numpy as npclass NaiveBayes:def __init__(self,labda=1):self.py = Noneself.pxy = Noneself.labda = labdadef fit(self,X_train,y_train):size = len(y_train)size_plus = size + len(set(y_train)) * self.labdapy = {} #保存各个类别的先验概率# 贝叶斯算法第(1)步# 计算先验概率for label in set(y_train):py[label] = (np.sum(y_train == label) + self.labda) / size_plus# 计算条件概率feature_nums = np.zeros((X_train.shape[1],1))# 特征数for i in range(X_train.shape[1]):feature_nums[i] = len(set(X_train[:,i]))pxy = {}# 遍历所有的标签for label in set(y_train):# 有几个特征for i in range(X_train.shape[1]):# 遍历所有的特征for feature in X_train[:,i]:if (i,feature,label) not in pxy:pxy[(i,feature,label)] = (sum(X_train[y_train==label][:,i]==feature) + self.labda) / (np.sum(y_train == label) + feature_nums[i] * self.labda)# 例题4.2的打印print('P(X[%s]=%s|Y=%s)=%d/%d' %(i+1,feature,label,sum(X_train[y_train==label][:,i]==feature) + self.labda,np.sum(y_train == label) + feature_nums[i] * self.labda))self.py = pyself.pxy = pxydef predict(self,X_test):# 贝叶斯算法第(1)步return np.array([self._predict(X_test[i]) for i in  range(X_test.shape[0])])def _predict(self,x):pck = []for label in self.py:p = self.py[label]for i in range(x.shape[0]):p *=  self.pxy[(i,x[i],label)] pck.append((p,label))#print(sorted(pck,key = lambda x:x[0],reverse=True))return sorted(pck,key = lambda x:x[0])[-1][1]def score(self,X_test,y_test):pass

我们用例题4.2的数据来测试一下:

X = np.array([['1','S'],['1','M'],['1','M'],['1','S'],['1','S'],['2','S'],['2','M'],['2','M'],['2','L'],['2','L'],['3','L'],['3','M'],['3','M'],['3','L'],['3','L']
])
y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])nb = NaiveBayes()nb.fit(X,y)
X_test = np.array(['2','S']).reshape(1,-1)
print(nb.predict(X_test))

输出:

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[2]=S|Y=1)=2/12
P(X[2]=M|Y=1)=5/12
P(X[2]=L|Y=1)=5/12
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[2]=S|Y=-1)=4/9
P(X[2]=M|Y=-1)=3/9
P(X[2]=L|Y=-1)=2/9
[-1]

最终打印所属类别为 − 1 -1 1,这个例子太简单了。

我们再试下iris数据集。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pddef create_data():iris = load_iris()df = pd.DataFrame(iris.data, columns=iris.feature_names)df['label'] = iris.targetdf.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']data = np.array(df.iloc[:100, :])return data[:,:-1], data[:,-1]X, y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

同时需要优化下代码:

import numpy as npclass NaiveBayes:def __init__(self,labda=1):self.py = Noneself.pxy = Noneself.labda = labdadef fit(self,X_train,y_train):size = len(y_train)size_plus = size + len(set(y_train)) * self.labdapy = {}# 贝叶斯算法第(1)步# 计算先验概率for label in set(y_train):#取对数,变相乘为相加,防止概率过小导致溢出py[label] = np.log((np.sum(y_train == label) + self.labda) / size_plus)#py[label] = (np.sum(y_train == label) + self.labda) / size_plus# 计算条件概率feature_nums = np.zeros((X_train.shape[1],1))# 特征数for i in range(X_train.shape[1]):feature_nums[i] = len(set(X_train[:,i]))pxy = {}# 遍历所有的标签for label in set(y_train):# 有几个特征for i in range(X_train.shape[1]):# 遍历所有的特征for feature in X_train[:,i]:if (i,feature,label) not in pxy:# 这里也可以取对数pxy[(i,feature,label)] = np.log((sum(X_train[y_train==label][:,i]==feature) + self.labda) / (np.sum(y_train == label) + feature_nums[i] * self.labda))self.py = pyself.pxy = pxydef predict(self,X_test):# 贝叶斯算法第(2)步return np.array([self._predict(X_test[i]) for i in  range(X_test.shape[0])])def _predict(self,x):pck = []for label in self.py:p = self.py[label]for i in range(x.shape[0]):#如果(i,x[i],label)不在pxy中,则不累计if (i,x[i],label) in self.pxy:p +=  self.pxy[(i,x[i],label)] pck.append((p,label))# 贝叶斯算法第(3)步return sorted(pck,key = lambda x:x[0])[-1][1]def score(self,X_test,y_test):return np.sum(self.predict(X_test) == y_test) / len(y_test)

主要有把概率练乘取对数变成累加,防止概率连乘过小溢出;

nb1 = NaiveBayes()
nb1 .fit(X_train,y_train)
nb1 .score(X_test,y_test)

在这里插入图片描述

参考

  1. 统计学习方法
  2. https://blog.csdn.net/weixin_41575207/article/details/81742874
  3. https://blog.csdn.net/rea_utopia/article/details/78881415

http://chatgpt.dhexx.cn/article/4riSwbfK.shtml

相关文章

数据挖掘十大算法之 naïve Bayes

朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的分类方法。朴素贝叶斯法实现简单,学习与预测的效率都很高,被广泛应用于文本分类、垃圾邮件过滤、自然语言处理等场景。下面我们来介绍贝叶斯定理,在介绍贝叶斯定理之前,先介绍下…

专题:深度神经网络基本问题的原理详细分析和推导

文章目录 **写在最前面****1 神经网络算法的直观了解****1.1 神经网络过程描述**:**1.2 神经网络相关的几个问题****1.2.1 表征假设和激活函数** **1.2.2 结构设计(Architecture Design)****1.2.3 代价函数(Cost Function)和优化目标(Optimization objective)****1.…

第四章 朴素贝叶斯法

文章目录 朴素贝叶斯法的学习与分类基本方法数据定义学习联合概率分布如何求出条件概率分布?如何分类? 后验概率最大化的含义 朴素贝叶斯的参数估计法极大似然估计学习分类算法贝叶斯估计 朴素贝叶斯法(与贝叶斯估计是不同的概念)…

GAN生成对抗式神经网络数学推导

由上面一篇文章我们已经知道了,如果我们从真实数据分布里面取n个样本,根据给定样本我们可以列出其出现概率的表达式,那么生成这N个样本数据的似然(likelihood)就是 l ( θ ) ∏ i 1 N p ( x i ∣ θ ) l ( \theta ) \prod _ { i 1 } ^ { …

《统计学习方法》学习笔记(三)之 朴素贝叶斯法

朴素贝叶斯法 总述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练数据集,首先基于特征独立性假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 x x x,利用贝叶斯定理求出后验概率最…

朴素贝叶斯(二)|极大似然估计+学习与分类算法+贝叶斯估计| 《统计学习方法》学习笔记(十六)

朴素贝叶斯法的参数估计 1. 极大似然估计 在朴素贝叶斯法中,学习意味着估计 P ( Y c k ) P(Yc_k) P(Yck​)和 P ( X ( j ) x ( j ) ∣ Y c k ) P(X^{(j)}x^{(j)}|Yc_k) P(X(j)x(j)∣Yck​)。可以应用极大似然估计法估计相应的概率。先验概率 P ( Y c k ) P(Yc…

一文看懂 “极大似然估计” 与 “最大后验估计” —— 最大后验估计篇

本文历次修订后全长 2万8000余字,受到 CSDN 博文字数限制,故切分两篇发布,所以现在是两文看懂了… 前篇介绍参数估计背景和极大似然估计;本篇介绍最大后验估计和两种方法对比请务必先看前文:一文看懂 “极大似然估计”…

【生成模型】极大似然估计,你必须掌握的概率模型

上一期为大家说明了什么是无监督生成模型。在无监督生成模型中,极大似然法一直扮演着非常核心的位置,我们必须对它有深刻的理解,本期小米粥将为大家讲一下极大似然法的那些事情。 作者&编辑 | 小米粥 1 一个小游戏:取球猜概率…

透彻理解机器学习中极大似然估计MLE的原理(附3D可视化代码)

文章目录 相关资料一、什么是概率,什么是似然二、极大似然估计 Maximum Likelihood Estimation (MLE) 的含义2.1 机器学习中的极大化似然函数2.2 极大似然估计和损失函数的关系VAE最大化似然函数推导出损失函数 三、代码可视化:极大似然估计3.1 似然函数…

C#RSA密码以及利用欧几里得算法实现两数互质的判断

最近做课程设计,想到以前看过RSA密码的相关内容,于是就想用刚学的C#做一个数字加密系统。RSA加密的流程如下: 来看一个“玩具式”的例子: (1)选取两个素数p2,q11,于是N22. (2)构造数,这是小于22且不含因数2和11的自然数的个数。 (3)选一个…

判断两数互质,java实现

数组下标i和j值互质时,a[i][j] true,反之false Write a program to create an n * n Boolean array. If I and j are coprime, a [i] [J] is true, otherwise it is false /** * When Array index Mutuality ,a[i][j] true,else is false * 数组i和j值互质时&…

两个质数互质是_两个数互质是什么意思 如何判断

互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。下面是小编整理的详细内容,一起来看看吧! 两个数互质是什么意思 质数为数学中的一种概念,即两个或多…

char、wchar_t、ACHAR、WCHAR、TCHAR

最近用到上面几种不同的字符类型,下面贴上在网上收集到的资料。 1、char 单字节变量类型,最多表示256个字符。 2、wchar_t 宽字节变量类型,用于表示Unicode字符,它实际定义在<string.h>里:typedef unsigned short wchar_t。 定义宽字节类型方法如下: wchar_…

wchar* 转换成 string

wchar* 转换成 string 123 windows 类型转换问题 1 // Your wchar_t* wstring ws(L"Hello World"); // your new String std::string str(ws.begin(), ws.end()); // Show String std::cout << str << std::endl; 2 std::wstring wstr(L"Test&…

wchar_t类型

今天在看前辈的项目的时候学习到了一个以前没有通过的数据类型&#xff1a;宽字符wchar_t类型。 先来看看他占多大的空间吧&#xff0c; 从图中可以看到wchar_t占的空间的大小为2个字节&#xff0c; 然后来确定一下他是无符号还是有符号的 由上图可见&#xff0c;他应该是无符号…

char与wchar_t字符串

C里的字符串类型是比较二的&#xff0c;因为有太多表示方法&#xff1a;char*、string、字符串数组、wchar_t*、wstring&#xff0c;今天就来缕一缕这些玩意。 char* char* 貌似是C字符串最基础最核心的。 看以下四个字符串声明及输出结果&#xff1a; 先说说核心&#xff0c…

wchar_t的用法

wchar_t的解释可以看这里:这里 程序和解析: 1 # include<stdio.h>2 # include<stdlib.h>3 # include<locale.h>//设置本地化<

WCHAR的简单操作

WCHAR 是双字节类型&#xff0c;一般它用来存储那些双字节而不是单字节字符.较长的字节数可以支持 在应用程序的国际发布版本里所使用的扩展字符集(如常用的Unicode字符集). 比如说&#xff1a;在中文系统下开发的软件&#xff0c;当应用到日文操作系统时&#xff0c;如果没有采…

ADI Diff-Amp Calculator差分放大器件计算器使用方法

Diff-Amp Calculator便于计算单端转差分放大&#xff0c;差分转差分放大&#xff0c;在满足输入信号和输出信号的参数要求下&#xff0c;配置元件增益自动计算Rf和Rg阻值大小。 下载地址&#xff1a;https://www.analog.com/cn/design-center/interactive-design-tools/adi-dif…

双电阻差分电流采样_差分信号和差分电路讲解 差分放大电路应用

1、什么是差分信号?为什么要用差分信号? 两个芯片要通信,我们把它们用一根导线连接起来,一个传输 1,另一个接受 1,一个传输 0,另一个接受 0,不是很好吗?为什么还要搞其他的花花肠子。 因为有干扰,各种各样的干扰,比如温度,电磁辐射等等,这些干扰使得传输的 1 不再…