机器学习之朴素贝叶斯法(Naive Bayes)

1. 朴素贝叶斯算法简介

朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性假设为前提,就会导致算法精度在某种程度上受影响。朴素贝叶斯法是基于贝叶斯定理特征条件独立假设分类方法,是一种典型的生成方法,即学习到了输入与输出的联合概率分布 P ( X , Y ) P(X,Y) P(X,Y),这个就是朴素贝叶斯法学习的成果。学习到这个有什么用呢?通过这个联合概率布 P ( X , Y ) P(X,Y) P(X,Y)结合 P ( X ) P(X) P(X), P ( X ) P(X) P(X)对于给定样本X是已知的,就能求出在给定实例 x x x下分类为某类 c k c_k ck的概率
P ( Y = c k ∣ X = x ) = P ( X = x , Y = c k ) P ( X = x ) P(Y=c_k|X=x)=\frac{P(X=x, Y=c_k)}{P(X=x)} P(Y=ckX=x)=P(X=x)P(X=x,Y=ck)
朴素贝叶斯把x对应的最大概率的那一类作为输出。

1.1 什么是贝叶斯定理

首先贝叶斯定理的表达式是 P ( Y ∣ X ) = P ( Y ) P ( X ∣ Y ) P ( X ) P(Y|X)=\frac{P(Y)P(X|Y)}{P(X)} P(YX)=P(X)P(Y)P(XY),即知道了在Y已知条件下X的概率以及X与Y的概率,就能求出在X已知条件下Y的概率。在这个算法背景下,如果知道了在分类Y已知条件下某实例X的概率,以及Y为某一类的概率和X为某具体实例的概率,就能求出在特征实例X已知条件下分类Y的概率。即:
P ( Y = c k ∣ X = x ) = P ( Y = c k ) P ( X = x ∣ Y = c k ) P ( X = x ) P(Y=c_k|X=x)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{P(X=x)} P(Y=ckX=x)=P(X=x)P(Y=ck)P(X=xY=ck)
P ( X = x ) P(X=x) P(X=x)无法直接求出,必须是要在已知具体某一类 Y = c k Y=c_k Y=ck的条件下才能求出。所以根据全概率公式,有:
P ( X = x ) = ∑ k = 1 K P ( X = x ∣ Y = c k ) P ( Y = c k ) P(X=x)=\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k) P(X=x)=k=1KP(X=xY=ck)P(Y=ck)
于是朴素贝叶斯模型的基本形式如下:
P ( Y = c k ∣ X = x ) = P ( Y = c k ) P ( X = x ∣ Y = c k ) ∑ k = 1 K P ( X = x ∣ Y = c k ) P ( Y = c k ) P(Y=c_k|X=x)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)} P(Y=ckX=x)=k=1KP(X=xY=ck)P(Y=ck)P(Y=ck)P(X=xY=ck)
这时我们可以观察一下,要学习到一个朴素贝叶斯模型,需要学习什么呢?本质上朴素贝叶斯是需要学习到输入输出的联合分布,即P(X,Y),但利用贝叶斯定理以及全概率,其实只需要学习两个先验分布: P ( Y = c k ) P(Y=c_k) P(Y=ck)以及 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=xY=ck),而学习的关键之处在于学习到条件特征分布 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=xY=ck)

1.2 什么特征条件独立?

事件A与B独立的充要条件为 P ( A B ) = P ( A ) ∗ P ( B ) P(AB)=P(A)*P(B) P(AB)=P(A)P(B),或者说 P ( A = A i , B = B j ) = P ( A = A i ) ∗ P ( B = B j ) P(A=A_i, B=B_j)=P(A=A_i)*P(B=B_j) P(A=Ai,B=Bj)=P(A=Ai)P(B=Bj)对于A、B的任意取值都成立。即A取什么值与B取什么值没有联系。在朴素贝叶斯法学习下,特征独立指的就是每一个特征取什么值与其余的特征取值无关,所以在学习一个实例 x x x(包含n个特征,即 x = ( x 1 , x 2 , . . . , x n ) x=(x^{1},x^{2} ,...,x^{n}) x=(x1,x2,...,xn))的概率时可以这样:
P ( X = x ) = P ( X 1 = x 1 , X 2 = x 2 , . . . . , X n = x n ) P(X=x) = P(X^{1} =x^{1}, X^{2} =x^{2},....,X^{n} =x^{n}) P(X=x)=P(X1=x1,X2=x2,....,Xn=xn)
而由于每个特征的取值与其余特征无关,所以上式可以写为:
P ( X = x ) = P ( X 1 = x 1 ) ∗ P ( X 2 = x 2 ) ∗ . . . . ∗ P ( X n = x n ) P(X=x) = P(X^{1} =x^{1})*P(X^{2} =x^{2})*....*P(X^{n} =x^{n}) P(X=x)=P(X1=x1)P(X2=x2)....P(Xn=xn)

特征条件独立是在给定条件下特征要独立,这个条件就是指定实例 x x x所对应的类别 Y = C k Y=C_k Y=Ck,也就是说给定实例 x x x的类别 Y = C k Y=C_k Y=Ck条件下, x x x特征独立。即:
P ( X = x ∣ 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 ) P(X=x|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) P(X=xY=Ck)=P(X1=x1Y=Ck)P(X2=x2Y=Ck)....P(Xn=xnY=Ck)

假设特征条件独立的意义在于减少参数的数量,极大地简化模型,计算速度快,但是现实中特征或多或少有联系,特征条件独立的假设可能会牺牲一定的分类准确率。

1.3 为什么要假设特征条件独立?

给定训练数据集:
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1), (x_2,y_2),..., (x_N,y_N) \} T={(x1,y1),(x2,y2),...,(xN,yN)},其中 x i ∈ X ⊆ R n x_i\in\mathcal{X}\sube R^n xiXRn为实例的特征向量, y i ∈ Y = { c 1 , c 2 , . . . , c K } 为 实 例 的 类 别 , i = 1 , 2 , . . . , N y_i \in \mathcal{Y}=\{c_1,c_2,...,c_K\}为实例的类别, i=1,2,...,N yiY={c1,c2,...,cK},i=1,2,...,N

朴素贝叶斯根据训练数据集学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)。具体学习以下先验(已知y,叫先验;后知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 2 = x 2 , . . . , X n = x n ∣ Y = c k ) P(X=x|Y=c_k)=P(X^1=x^1,X^2=x^2,...,X^n=x^n |Y=c_k ) P(X=xY=ck)=P(X1=x1,X2=x2,...,Xn=xnY=ck)
从以上两个先验概率分布学习到联合分布 P ( X , Y ) = P ( X = x , Y = c k ) P(X,Y)=P(X=x, Y=c_k) P(X,Y)=P(X=x,Y=ck)

P ( X = x , Y = c k ) = P ( X 1 = x 1 , X 2 = x 2 , . . . , X n = x n , Y = c k ) P(X=x, Y=c_k)=P(X^1=x^1,X^2=x^2,...,X^n=x^n ,Y=c_k ) P(X=x,Y=ck)=P(X1=x1,X2=x2,...,Xn=xn,Y=ck)

可是有个问题, P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=xY=ck)的参数非常多,估计起来有点不现实: 若第j个特征 x j x^j xj的取值有 S j S_j Sj个,则总共要求的参数就有 K ∏ j = 1 n S j K\displaystyle\prod_{j=1}^nS_j Kj=1nSj个, 即要学习 K ∏ j = 1 n S j K\displaystyle\prod_{j=1}^nS_j Kj=1nSj个概率,得到$P(X=x, Y=c_k)的分布。比如有5个特征,每个特征取值5个,总共3分类,看似已经很简单了,可是参数的个数却有 3 ∗ 5 5 3*5^5 355=9375个,更别说特征数量以及维度大一点的模型了。

所以对于这个问题,需要做一些假设,即特征条件独立的假设,这个假设是说当在给定类 c k c_k ck的条件下,每个特征的取值与其他特征是独立的,这是一个很强的假设,但可以极大地简化模型,朴素贝叶斯的naive正是因此而来。在这个假设条件下
P ( X = x ∣ Y = c k ) = P ( X 1 = x 1 , X 2 = x 2 , . . . , X n = x n ∣ Y = c k ) = ∏ j = 1 n P ( X j = x j ∣ Y = c k ) \begin{aligned} P(X=x|Y=c_k) &=P(X^1=x^1,X^2=x^2,...,X^n=x^n |Y=c_k )\\ &=\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)\\ \end{aligned} P(X=xY=ck)=P(X1=x1,X2=x2,...,Xn=xnY=ck)=j=1nP(Xj=xjY=ck)
在这时,上面那个条件概率分布 P ( X = x ∣ Y = c k ) P(X=x|Y=c_k) P(X=xY=ck)参数个数为 K ∑ j = 1 n S j = 3 ∗ ( 5 ∗ 5 ) = 75 K\displaystyle\sum_{j=1}^nS_j=3*(5*5)=75 Kj=1nSj=3(55)=75个,极大的减少了参数的数量。但是所带来的缺点就是会牺牲一定的分类准确率。

1.4 朴素贝叶斯模型与学习策略

上面简化模型之后,朴素贝叶斯法根据输入的实例 x x x,计算出每一类的概率,并将概率最大的那一类最为 x x x的类输出。这就是模型的评价准则,给定 x x x可能输出的类有K个,哪一个类最好呢?就是当后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ckX=x)最大的那个类最好。

P ( Y = c k ∣ X = x ) = P ( Y = c k , X = x ) P ( X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) P ( X = x ) = ∏ j = 1 n P ( X j = x j ∣ Y = c k ) P ( Y = c k ) ∑ k = 1 K P ( X = x ∣ Y = c k ) P ( Y = c k ) \begin{aligned} P(Y=c_k|X=x) &=\frac{P(Y=c_k,X=x)}{P(X=x)}\\ &=\frac{P(X=x|Y=c_k)P(Y=c_k)}{P(X=x)}\\ &=\frac{\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)P(Y=c_k)}{\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)}\\ \end{aligned} P(Y=ckX=x)=P(X=x)P(Y=ck,X=x)=P(X=x)P(X=xY=ck)P(Y=ck)=k=1KP(X=xY=ck)P(Y=ck)j=1nP(Xj=xjY=ck)P(Y=ck)

模型的输出y为:
y = f ( x ) = arg max ⁡ c k ∏ j = 1 n P ( X j = x j ∣ Y = c k ) P ( Y = c k ) ∑ k = 1 K P ( X = x ∣ Y = c k ) P ( Y = c k ) y=f(x)={\underset {c_k}{\operatorname {arg\,max} }}\frac{\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)P(Y=c_k)}{\displaystyle\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)} y=f(x)=ckargmaxk=1KP(X=xY=ck)P(Y=ck)j=1nP(Xj=xjY=ck)P(Y=ck)
对于每一类 c k c_k ck来说,分母都一样,所以在求极大值时可以省略,故而最终输出为:
y = f ( x ) = arg max ⁡ c k ∏ j = 1 n P ( X j = x j ∣ Y = c k ) P ( Y = c k ) y=f(x)={\underset {c_k}{\operatorname {arg\,max} }}\displaystyle\prod_{j=1}^nP(X^j=x^j|Y=c_k)P(Y=c_k) y=f(x)=ckargmaxj=1nP(Xj=xjY=ck)P(Y=ck)

所以观察这个公式,给定数据集,这个方法所要求的就是Y取每一类的概率,然后在每一类确定的情况下每个特征取到某个具体值的条件概率。

所以朴素贝叶斯模型能计算出在给定实例 x x x下,计算出每一类的概率。然后依据后验概率最大化(也是期望风险最小化,即学习策略)将实例强行归为后验概率最大的那个类别并输出。

2 参数估计

知道了朴素贝叶斯法的基本方法,具体是怎么学习的,输出的类是是后验概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ckX=x)最大的类,那么怎么来求出这个概率 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ckX=x)呢?可以看出这个概率有两种参数:

  • 类概率: P ( Y = c k ) , k = 1 , 2 , . . . , K P(Y=c_k),k=1,2,...,K P(Y=ck)k=1,2,...,K
  • 给定类下 第 j 个 特 征 取 第 l 个 值 的 概 率 第j个特征取第l个值的概率 jl : P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xljY=ck)

只要模型求出了这类参数,就可以求出给定 x x x下输出每一类的概率,并把概率最大的类最为输出值。

2.1 极大似然估计

现用极大似然估计法求这两类参数:
首先估计 P ( Y = c k ) P(Y=c_k) P(Y=ck),以k类为代表,k=1,2,…,K
令: P ( Y = c k ) = P k , P ( Y ≠ c k ) = 1 − P k P(Y=c_k)=P_k ,P(Y\ne c_k)=1-P_k P(Y=ck)=Pk,P(Y=ck)=1Pk
则似然函数L为:
L ( P k ) = P k ∑ i = 1 N I ( y i = c k ) ( 1 − P k ) ∑ i = 1 N I ( y i ≠ c k ) L(P_k)=P_k^{\small\displaystyle\sum_{i=1}^NI(y_i=c_k) }(1-P_k)^{\small\displaystyle\sum_{i=1}^NI(y_i\ne c_k) } L(Pk)=Pki=1NI(yi=ck)(1Pk)i=1NI(yi=ck)
l n L ( P k ) = ∑ i = 1 N I ( y i = c k ) ∗ l n P k + ∑ i = 1 N I ( y i ≠ c k ) ∗ l n ( 1 − P k ) ln L(P_k)=\displaystyle\sum_{i=1}^NI(y_i=c_k)*lnP_k +\displaystyle\sum_{i=1}^NI(y_i\ne c_k)*ln(1-P_k) lnL(Pk)=i=1NI(yi=ck)lnPk+i=1NI(yi=ck)ln(1Pk)
∂ l n L ( P k ) ∂ P k = ∑ i = 1 N I ( y i = c k ) P k − ∑ i = 1 N I ( y i ≠ c k ) 1 − P k = 0 \frac{\partial ln L(P_k)}{\partial P_k} =\frac{\displaystyle\sum_{i=1}^NI(y_i=c_k)}{P_k}-\frac{\displaystyle\sum_{i=1}^NI(y_i\ne c_k)}{1-P_k}=0 PklnL(Pk)=Pki=1NI(yi=ck)1Pki=1NI(yi=ck)=0
解得 P k = ∑ i = 1 N I ( y i = c k ) N P_k=\frac{\displaystyle\sum_{i=1}^NI(y_i=c_k)}{N} Pk=Ni=1NI(yi=ck),k=1,2,…,K

下面估计 P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xljY=ck), X j X^j Xj可能取值为 { x 1 j , x 2 j , . . . , x S j j } \{x^j_1,x^j_2,...,x^j_{S_j} \} {x1j,x2j,...,xSjj}

P ( X j = x l j ∣ Y = c k ) = P k j l P(X^j=x^j_l|Y=c_k)=P_{kjl} P(Xj=xljY=ck)=Pkjl, P ( X j ≠ x l j ∣ Y = c k ) = 1 − P k j l P(X^j\ne x^j_l|Y=c_k)=1-P_{kjl} P(Xj=xljY=ck)=1Pkjl
则似然函数为:
L ( P k j l ) = P k j l ∑ i = 1 N I ( y i = c k , X j = x l j ) ( 1 − P k j l ) ∑ i = 1 N I ( y i = c k , X j ≠ x l j ) L(P_{kjl})=P_{kjl}^{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }(1-P_{kjl})^{\small\displaystyle\sum_{i=1}^NI(y_i= c_k,X^j\ne x^j_l) } L(Pkjl)=Pkjli=1NI(yi=ck,Xj=xlj)(1Pkjl)i=1NI(yi=ck,Xj=xlj)
l n L ( P k j l ) = ∑ i = 1 N I ( y i = c k , X j = x l j ) ∗ l n P k j l + ∑ i = 1 N I ( y i = c k , X j ≠ x l j ) ∗ l n ( 1 − P k j l ) ln L(P_{kjl})={\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }*lnP_{kjl} +{\small\displaystyle\sum_{i=1}^NI(y_i= c_k,X^j\ne x^j_l)*ln(1-P_{kjl}) } lnL(Pkjl)=i=1NI(yi=ck,Xj=xlj)lnPkjl+i=1NI(yi=ck,Xj=xlj)ln(1Pkjl)
∂ l n L ( P k j l ) ∂ P k j l = ∑ i = 1 N I ( y i = c k , X j = x l j ) P k j l − ∑ i = 1 N I ( y i = c k , X j ≠ x l j ) ∗ l n ( 1 − P k j l ) 1 − P k j l = 0 \frac{\partial ln L(P_{kjl})}{\partial P_{kjl}} =\frac{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }{P_{kjl}}-\frac{\small\displaystyle\sum_{i=1}^NI(y_i= c_k,X^j\ne x^j_l)*ln(1-P_{kjl})}{1-P_{kjl}}=0 PkjllnL(Pkjl)=Pkjli=1NI(yi=ck,Xj=xlj)1Pkjli=1NI(yi=ck,Xj=xlj)ln(1Pkjl)=0
解得 P k j l = ∑ i = 1 N I ( y i = c k , X j = x l j ) ∑ i = 1 N I ( y i = c k ) P_{kjl}=\frac{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) }{\displaystyle\sum_{i=1}^NI(y_i= c_k)} Pkjl=i=1NI(yi=ck)i=1NI(yi=ck,Xj=xlj)

通过以上两个极大似然估计值可以看到, P ( Y = c k ) P(Y=c_k) P(Y=ck)就是所有样本中 c k c_k ck出现的频率,而 P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xljY=ck)就是在 c k c_k ck类样本当中, j j j特征取到第 l l l个值的频率 。

2.2贝叶斯估计

极大似然估计可能会出现一个问题,即新输入的实例 x x x的某个特征取的值,在某个类下未出现过。如 ∑ i = 1 N I ( y i = c k , X j = x l j ) = 0 \displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l)=0 i=1NI(yi=ck,Xj=xlj)=0,就说在类 c k c_k ck下,第 j j j个特征从未取到过第 l l l个值,这时候 P ( X j = x l j ∣ Y = c k ) P(X^j=x^j_l|Y=c_k) P(Xj=xljY=ck)=0,所以 P ( Y = c k ∣ X = x ) = 0 P(Y=c_k|X=x)=0 P(Y=ckX=x)=0,显然这个问题会影响后验概率的结果,因为训练集未出现这个情况并不代表这个 x x x特征下完全不可能是 c k c_k ck类。解决这个问题的一种方法是采用贝叶斯估计。

条件概率的贝叶斯估计是:
P λ ( X j = x l j ∣ Y = c k ) = ∑ i = 1 N I ( y i = c k , X j = x l j ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ P_\lambda(X^j=x^j_l|Y=c_k)=\frac{\small\displaystyle\sum_{i=1}^NI(y_i=c_k,X^j=x^j_l) +\lambda}{\displaystyle\sum_{i=1}^NI(y_i= c_k)+S_j\lambda} Pλ(Xj=xljY=ck)=i=1NI(yi=ck)+Sjλi=1NI(yi=ck,Xj=xlj)+λ
其中 S j S_j Sj是特征j的取值总个数, λ > = 0 \lambda>= 0 λ>=0

λ \lambda λ取0时,结果和极大似然估计一样,当 λ = 1 \lambda=1 λ=1时,称为拉普拉斯平滑。

模型的介绍到这就结束了,下面进行实例演练。

3.实例操作

就用李航博士《统计机器学习》第二版树上的例题来做。

import numpy as np
import pandas as pd
  1. 创建数据
X_1=np.array([1,1,1,1,1,2,2,2,2,2,3,3,3,3,3])
X_2=np.array(['s','m','m','s','s','s','m','m','l','l','l','m','m','l','l'])
y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])
data = pd.DataFrame(columns=['X_1','X_2','y'])
data['X_1'] = X_1
data['X_2'] = X_2
data['y'] = y
  1. 分离实例与标签
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
  1. 构造朴素贝叶斯模型
def NB(X,y,x):
    """
    X:训练集特征矩阵
    y:训练集标签数组
    x:需要预测的实例
    """
    p_y={}  # 用来计算每个类的概率 P(Y=ck)
    p_Y_x = {}  # 用来保存所有的条件概率
    for i in np.unique(y):
        p_y[i] = sum(y==i)/len(y)
        p_Y_x[i]={} 
        for n in X.columns:
            p_Y_x[i][n] = {}
            for x1 in np.unique(X[n]):
                p_Y_x[i][n][x1] = sum(data[y==i][n]==x1)/sum(y==i)
    p_x = {}  # 用来储存在x条件下输出每一类的概率
    for k in np.unique(y):
        p_x[k] = p_y[k]
        for m,p in zip(X.columns,x):
            p_x[k] = p_x[k] * p_Y_x[k][m][p]
     print(p_x)
    final_class = max(p_x, key=p_x.get)  # 取概率最大的类输出
    return final_class
NB(X,y,x)   # 输出-1

可以看到,输出-1类的概率为1/15,输出+1类的概率为1/45,所以最终输出了-1类。该手写模型适用于任意数量的类,任意数量的特征,每个特征取值也可以是任意数量的。对参数采用极大似然估计,该模型没解决要估计的某个条件概率为0的情况,下面加入 λ \lambda λ

def NB_lambad(X,y,x,_lambda):
    """
    X:训练集特征矩阵
    y:训练集标签数组
    x:需要预测的实例
    """
    p_y={}  # 用来计算每个类的概率 P(Y=ck)
    p_Y_x = {}  # 用来保存所有的条件概率
    for i in np.unique(y):
        p_y[i] = sum(y==i)/len(y)
        p_Y_x[i]={} 
        for n in X.columns:
            p_Y_x[i][n] = {}
            for x1 in np.unique(X[n]):
                # 贝叶斯估计只需修改这步
                p_Y_x[i][n][x1] = ( sum(data[y==i][n]==x1)+_lambda) / (sum(y==i)+len(np.unique(X[n]))*_lambda)
    p_x = {}  # 用来储存在x条件下输出每一类的概率
    for k in np.unique(y):
        p_x[k] = p_y[k]
        for m,p in zip(X.columns,x):
            p_x[k] = p_x[k] * p_Y_x[k][m][p]
    print(p_x)
    final_class = max(p_x, key=p_x.get)  # 取概率最大的类输出
    return final_class
NB_lambad(X,y,x,1)  # 输出-1

至于机器学习库scikit-learn的中的朴素贝叶斯算法学习请点击这里,里面有详细的教程

参考:
李航博士 《统计机器学习》第二版
机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器

谢谢阅读,请多多指教。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值