引言

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

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

基本方法

设输入空间X⊆Rn\mathcal{X} \subseteq R^nX⊆Rn为nnn维向量的集合,输出空间为类标记集合Y={c1,c2,⋯,cK}\mathcal{Y} = \{c_1,c_2,\cdots,c_K\}Y={c1​,c2​,⋯,cK​}。输入为特征向量x∈Xx \in \mathcal{X}x∈X,输出标记y∈Yy \in \mathcal{Y}y∈Y。 XXX是定义在输入空间X\mathcal XX上的随机变量,YYY是定义在输出空间Y\mathcal YY上的随机变量。 P(X,Y)P(X,Y)P(X,Y)是XXX和YYY的联合概率分布。

训练数据集由P(X,Y)P(X,Y)P(X,Y)独立同分布产生。

朴素贝叶斯法通过训练数据集学习联合概率分布P(X,Y)P(X,Y)P(X,Y)。具体地,学习以下先验概率分布及条件概率分布。先验概率分布:

P(Y=cK),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=ck)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck),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=x∣Y=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,BA,BA,B是两个事件,且P(A)>0P(A)>0P(A)>0,则称

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

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

那么P(X,Y)=P(X=x∣Y=ck)⋅P(Y=cK)P(X,Y) = P(X=x|Y=c_k) \cdot P(Y = c_K)P(X,Y)=P(X=x∣Y=ck​)⋅P(Y=cK​)

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

P(X=x∣Y=ck)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck)=∏j=1nP(X(j)=x(j)∣Y=ck)(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=x∣Y=ck​)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck​)=j=1∏n​P(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)相互独立,所以就有了上面的公式。

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

朴素贝叶斯法分类时,对给定的输入xxx,通过学习到的模型计算后验概率分布P(Y=ck∣X=x)P(Y=c_k|X=x)P(Y=ck​∣X=x),将后验概率最大的类作为xxx的类输出。后验概率计算根据贝叶斯定理进行:

P(Y=ck∣X=x)=P(X=x∣Y=ck)P(Y=ck)∑kP(X=x∣Y=ck)P(Y=ck)(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=ck​∣X=x)=∑k​P(X=x∣Y=ck​)P(Y=ck​)P(X=x∣Y=ck​)P(Y=ck​)​(4.4)

上式的分母用到了全概率公式:
如果事件A1,A2,⋯,AnA_1,A_2,\cdots,A_nA1​,A2​,⋯,An​是一个完备事件组(一个事件发生的所有可能性都在这里面),并且都有正概率,则有
P(B)=P(B∣A1)P(A1)+P(B∣A2)P(A2)+⋯+P(B∣An)P(An)=∑i=1nP(Ai)P(B∣Ai)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(B∣A1​)P(A1​)+P(B∣A2​)P(A2​)+⋯+P(B∣An​)P(An​)=i=1∑n​P(Ai​)P(B∣Ai​)
摘自人工智能数学基础之概率论

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

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

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

P(Y=ck∣X=x)=P(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)(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=ck​∣X=x)=∑k​P(Y=ck​)∏j=1n​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)∏j=1n​P(X(j)=x(j)∣Y=ck​)​(4.5)

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

y=f(x)=arg⁡max⁡ckP(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)(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)=argck​max​∑k​P(Y=ck​)∏j=1n​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)∏j=1n​P(X(j)=x(j)∣Y=ck​)​(4.6)

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

y=f(x)=arg⁡max⁡ckP(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)(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)=argck​max​P(Y=ck​)j=1∏n​P(X(j)=x(j)∣Y=ck​)(4.7)

后验概率最大化的含义

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

L(Y,f(X))={1if Y≠f(X)0if 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))={10​if Y​=f(X)if Y=f(X)​

损失函数期望公式 Rexp(f)=Ep[L(Y,f(X))]=∫X×YL(y,f(x))P(x,y)dxdyR_{exp}(f) = E_p[L(Y,f(X))] = \int_{\mathcal X \times \mathcal Y} L(y,f(x))P(x,y)dxdyRexp​(f)=Ep​[L(Y,f(X))]=∫X×Y​L(y,f(x))P(x,y)dxdy

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

Rexp(f)=E[L(Y,f(X))]=∫X×YL(y,f(x))P(x,y)dxdy=∫X×YL(y,f(x))P(y∣x)p(x)dxdy=∫X∫YL(y,f(x))P(y∣x)p(x)dxdy=∫X(∫YL(y,f(x))P(y∣x)dy)p(x)dx\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×Y​L(y,f(x))P(x,y)dxdy=∫X×Y​L(y,f(x))P(y∣x)p(x)dxdy=∫X​∫Y​L(y,f(x))P(y∣x)p(x)dxdy=∫X​(∫Y​L(y,f(x))P(y∣x)dy)p(x)dx​

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

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

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

为了使期望风险最小化,只需要X=xX=xX=x中每个xxx都取最小值,即逐个最小化,得:
f(x)=arg⁡min⁡y∈Y∑k=1KL(ck,y)P(ck∣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)=argy∈Ymin​k=1∑K​L(ck​,y)P(ck​∣X=x)

对于y=cky=c_ky=ck​的xxx其损失值为0,因此我们只要考虑y≠cky \neq c_ky​=ck​,其损失值为111,因此下面可以化简:

f(x)=arg⁡min⁡y∈Y∑k=1KL(ck,y)P(ck∣X=x)=arg⁡min⁡y∈Y∑k=1KP(y≠ck∣X=x)=arg⁡min⁡y∈Y(1−P(y=ck∣X=x))=arg⁡max⁡y∈YP(y=ck∣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)​=argy∈Ymin​k=1∑K​L(ck​,y)P(ck​∣X=x)=argy∈Ymin​k=1∑K​P(y​=ck​∣X=x)=argy∈Ymin​(1−P(y=ck​∣X=x))=argy∈Ymax​P(y=ck​∣X=x)​

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

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

朴素贝叶斯法的参数估计

极大似然估计

在朴素贝叶斯法中,学习意味着估计P(Y=ck)P(Y=c_k)P(Y=ck​)和P(X(j)=x(j)∣Y=ck)P(X^{(j)} = x^{(j)} | Y=c_k)P(X(j)=x(j)∣Y=ck​)。可以应用极大似然估计法估计相应的概率。

先验概率P(Y=ck)P(Y=c_k)P(Y=ck​)的极大似然估计是

P(Y=ck)=∑i=1NI(yi=ck)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​)=N∑i=1N​I(yi​=ck​)​, k=1,2,⋯,K(4.8)

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

设第jjj个特征x(j)x^{(j)}x(j) 可能取值的集合为{aj1,aj2,⋯,ajSj}\{a_{j1} ,a_{j2},\cdots,a_{jS_j}\}{aj1​,aj2​,⋯,ajSj​​},条件概率P(X(j)=ajl∣Y=ck)P(X^{(j)} = a_{jl} | Y =c_k)P(X(j)=ajl​∣Y=ck​) 的极大似然估计是

P(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)∑i=1NI(yi=ck)j=1,2,⋯,n;l=1,2,⋯,Sj;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)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)∑i=1N​I(xi(j)​=ajl​,yi​=ck​)​j=1,2,⋯,n;l=1,2,⋯,Sj​;k=1,2,⋯,K(4.9)

式中, xi(j)x^{(j)}_ixi(j)​ 是第iii个样本的第jjj个特征; ajla_{jl}ajl​ 是第jjj个特征可能取的第lll个值;III为指示函数。

说的是给定类别ckc_kck​的条件下,第jjj个特征为ajla_{jl}ajl​的概率。用类别ckc_kck​中第jjj个特征为ajla_{jl}ajl​的数量除以,类别ckc_kck​的数量。

学习与分类算法

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

输入:训练数据TTT
输出:实例xxx的分类。

  1. 计算先验概率及条件概率
    P(Y=ck)=∑i=1NI(yi=ck)N,k=1,2,⋯,KP(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)∑i=1NI(yi=ck)j=1,2,⋯,n;l=1,2,⋯,Sj;k=1,2,⋯,KP(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​)=N∑i=1N​I(yi​=ck​)​, k=1,2,⋯,KP(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)∑i=1N​I(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))Tx = (x^{(1)},x^{(2)},\cdots, x^{(n)})^Tx=(x(1),x(2),⋯,x(n))T,计算

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

  1. 确定实例xxx的类

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

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

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

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

P(Y=1)=915,P(Y=−1)=615P(Y=1) = \frac{9}{15},P(Y=-1) = \frac{6}{15}P(Y=1)=159​,P(Y=−1)=156​

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

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

我们要计算X=(2,S)TX=(2,S)^TX=(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)=S∣Y=−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)=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)}=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(X(1)=2∣Y=1)=39P(X^{(1)}=2|Y=1) = \frac{3}{9}P(X(1)=2∣Y=1)=93​ 首先Y=1Y=1Y=1的样本数量有9个,其中特征X(1)=2X^{(1)}=2X(1)=2的有3个,因此概率就是39\frac{3}{9}93​;
同理求得P(X(2)=S∣Y=1)=19P(X^{(2)}=S|Y=1) = \frac{1}{9}P(X(2)=S∣Y=1)=91​,P(X(1)=2∣Y=−1)=26P(X^{(1)}=2|Y=-1) =\frac{2}{6}P(X(1)=2∣Y=−1)=62​,P(X(2)=S∣Y=−1)=36P(X^{(2)}=S|Y=-1) =\frac{3}{6}P(X(2)=S∣Y=−1)=63​

下面就比较

P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=615×26×36=115P(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)=2∣Y=−1)P(X(2)=S∣Y=−1)=156​×62​×63​=151​

P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=915×39×19=145P(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)=2∣Y=1)P(X(2)=S∣Y=1)=159​×93​×91​=451​

显然,前者更大,因此y=−1y = -1y=−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)=2∣Y=−1)P(X(2)=S∣Y=−1)中P(X(2)=S∣Y=−1)=0P(X^{(2)}=S|Y=-1)=0P(X(2)=S∣Y=−1)=0,那么导致整个计算结果为000,就会影响最终判断。

通常是因为某个类别下XXX取某个特征的数量为0,
这时会影响到后验概率的计算结果。解决这一问题的方法是采用贝叶斯估计。条件概率的贝叶斯估计是

Pλ(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)+λ∑i=1NI(yi=ck)+Sjλ(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)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)+Sj​λ∑i=1N​I(xi(j)​=ajl​,yi​=ck​)+λ​(4.10)

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

分母加上SjS_jSj​个λ\lambdaλ,保证概率之和为111。

同样,先验概率的贝叶斯估计是
Pλ(Y=ck)=∑i=1NI(yi=ck)+λ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=1N​I(yi​=ck​)+λ​(4.11)

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

先例出所有的取值,A1={1,2,3},A2={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+115+2=717P(Y=-1) = \frac{6+1}{15+2} = \frac{7}{17}P(Y=−1)=15+26+1​=177​,P(Y=1)=9+115+2=1017P(Y=1) = \frac{9+1}{15+2} = \frac{10}{17}P(Y=1)=15+29+1​=1710​

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

比较

P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=717×39×49=28459=0.0610P(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.0610P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=177​×93​×94​=45928​=0.0610

P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1017×412×212=5153=0.0327P(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.0327P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=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

《统计学习方法》——朴素贝叶斯法相关推荐

  1. matlab贝叶斯判别后验概率,统计学习方法——朴素贝叶斯法、先验概率、后验概率(示例代码)...

    朴素贝叶斯法,就是使用贝叶斯公式的学习方法,朴素就是它假设输入变量(向量)的各个分量之间是相互独立的.所以对于分量之间不独立的分布,如果使用它学习和预测效果就不会很好. 简化策略 它是目标是通过训练数 ...

  2. 统计学习方法|朴素贝叶斯原理剖析及实现

    欢迎直接到我的博客查看最近文章:www.pkudodo.com.更新会比较快,评论回复我也能比较快看见,排版也会更好一点. 原始blog链接: http://www.pkudodo.com/2018/ ...

  3. 统计学习方法——朴素贝叶斯

    0.写在前面 朴素贝叶斯实际上是非常简单的一种机器学习方法,我们在之前的很多地方都讲过了,所以这里我们不再阐述具体的原理,可以移步:朴素贝叶斯. 但是,对于讨论班里,争论最多的就是课后的2个习题,因此 ...

  4. 李航统计学习方法-朴素贝叶斯

    朴素贝叶斯法 朴素贝叶斯(naïve Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法[1]. 对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然 后基于此模型, ...

  5. 复习04统计学习方法(朴素贝叶斯算法Naive Bayes)---图片版

  6. 朴素贝叶斯法的参数估计——贝叶斯估计及其Python实现

    统计学习方法--朴素贝叶斯法原理 1. 贝叶斯估计 1.1 为什么要用贝叶斯估计(极大似然的缺点) 1.2 贝叶斯估计原理 贝叶斯估计的算法过程合极大似然估计的算法过程一模一样,代码也几乎一模一样,只 ...

  7. 机器学习理论《统计学习方法》学习笔记:第四章 朴素贝叶斯法

    机器学习理论<统计学习方法>学习笔记:第四章 朴素贝叶斯法 4 朴素贝叶斯法 4.1 朴素贝叶斯法的学习与分类 4.1.1 基本方法 4.1.2 后验概率最大化的含义 4.2 朴素贝叶斯法 ...

  8. 统计学习方法笔记(李航)———第四章(朴素贝叶斯法)

    推荐阅读:小白之通俗易懂的贝叶斯定理(Bayes' Theorem) 朴素贝叶斯法是一种多分类算法,它的基础是"朴素贝叶斯假设"(假设实例的各个特征具有条件独立性).根据训练集估计 ...

  9. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...

    统计学习方法与Python实现(三)--朴素贝叶斯法 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然 ...

  10. 《统计学习方法》读书笔记——朴素贝叶斯法(公式推导+代码实现)

    传送门 <统计学习方法>读书笔记--机器学习常用评价指标 <统计学习方法>读书笔记--感知机(原理+代码实现) <统计学习方法>读书笔记--K近邻法(原理+代码实现 ...

最新文章

  1. Anaconda 环境下 R 包 ggraph_1.0.2 安装小记
  2. 通过几个Hello World感受.NET Core全新的开发体验
  3. B.Sport Mafia
  4. 对android.mk debug
  5. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
  6. Hibernate @OneToMany等注解设置查询过滤条件等
  7. Apache CXF入门
  8. Web Service/WCF 部署注意事项。
  9. PlaceHolder和Panel的区别【搜藏】
  10. Android 系统(22)--Android P 行为变更
  11. 【Elasticsearch】Elasticsearch高级调优方法论之——根治慢查询!
  12. axios文件上传 formdata_基于业务场景下的图片/文件上传方案总结
  13. arcgis支持python3吗_常见问题解答:ArcGIS 中使用的 Python 是什么版本?
  14. 如何使用计算机中的导出,解决方案:如何使用Canon 2525i复印机将文档扫描到计算机中并生成PDF格式?...
  15. MVP简单使用+RecyclerView
  16. wuli大excel
  17. 神经网络量化--per-channel量化
  18. 推荐 :你要的用户画像实践来了!
  19. 手把手教你制作一目了然的可视化地图
  20. 锐捷ac怎么发现局域网ap_锐捷 ac ap 连接 记录

热门文章

  1. PPC丢失后,手机信息如何保护?(C#)
  2. 不同用户登陆模块的实现
  3. 网络操作系统第224页作业
  4. maven的安装配置超详细教程【含nexus】
  5. RK3288 error: undefined reference to 'LOGD'
  6. java中int算法的有趣现象
  7. Zookeeper启动失败,报错 can not open chanel to 2
  8. 【排序】内部排序算法实现
  9. 【Python机器学习及实践】笔记
  10. (63)通信协议之一json