朴素贝叶斯方法朴素贝叶斯(naiveBayes)方法是一种基于贝叶斯定理和特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件的独立假设学习输入/输出的联合概率分布;然后基于这个模型,对于给定的输入x,利用贝叶斯定理找到后验概率最大的输出y。朴素贝叶斯方法实现简单,学习和预测效率很高,是一种常用的方法。朴素贝叶斯算法学习分类的基本方法设输入空间$x\subseteqR^n$为一组n维向量,输出空间为一组类标签$\gamma=\{c_1,c_2,...,c_k\}$。输入是特征向量$x\in\chi$,输出是类标签$y\in\gamma$。x是定义在输入空间$\chi$上的随机向量,Y是定义在输出空间$\gamma$上的随机变量。P(X,Y)是X和Y的联合概率分布。训练数据集$$T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}$$由P(X,Y)独立同分布生成。朴素贝叶斯通过训练数据集学习联合概率分布P(X,Y)。具体来说,学习了下面的先验概率分布和条件概率分布。先验概率分布$P(Y=c_k),k=1,2,...,K\tag{1}$条件概率分布$P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k),k=1,2,...,K\tag{2}$由先验概率和条件概率得到联合概率分布P(X,Y)。由于条件概率$P(X=x|Y=c_k)$的参数个数可以达到指数级别,其估计实际上是不可行的。其实假设$x^{(j)}$可以有$S_j$个值,j=1,2,...,n,Y可以有K个值,那么参数个数就是$K\prod_{j=1}^nS_j$。朴素贝叶斯方法假设条件概率分布具有条件独立性。由于这是一个强有力的假设,朴素贝叶斯的名字也由此而来。具体来说,条件独立假设是$$\begin{split}P(X=x|Y=c_k)=&P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k)\\=&\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)\end{split}\tag{3}$$朴素贝叶斯方法属于生成模型。条件独立假设使贝叶斯方法简单,但有时会牺牲一定的分类精度。在朴素贝叶斯分类中,对于给定的输入x,通过学习模型计算后验概率分布$P(Y=c_k|X=x)$,输出后验概率最大的类作为x的类。根据贝叶斯定理$$P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)}\tag{4}$$可以计算后验概率$$P(Y=c_k|X=x)=\frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum_{k=1}^KP(X=x|Y=c_k)P(Y=c_k)}\tag{5}$$将式(3)代入式(5)可得$$P(Y=c_k|X=x)=\frac{\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}{\sum_{k=1}^K\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}\tag{6}$$贝叶斯分类器可以表示为:$$y=f(x)=argmax_{c_k}\frac{\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}{\sum_{k=1}^K\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)}\tag{7}$$上述公式中间分母中的$c_k$是一样的,即不会影响结果,即$$y=f(x)=argmax_{c_k}\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k)P(Y=c_k)\tag{8}$$朴素贝叶斯分类的代码实现这里我们仍然以鸢尾花数据集为例,假设P(X|Y)服从高斯分布。$$P(x_i|y=c_k)=\frac{1}{\sqrt{2\pi\sigma_{c_k}^2}}exp(-\frac{(x_i-\mu_{c_k})^2}{2\sigma_{c_k}^2})$$$\sigma_{c_k}$表示$y=c_k$对应的x的标准差,$\mu_{c_k}$表示$对应的x的值y=c_k$的意思。#------------------加载数据----------------#data=load_iris()x,y=data['data'],data['target']x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=20190308,test_size=0.3)x_train.shape,y_train.shape#--------------朴素贝叶斯分类模型------------#classNaiveBayes:def__init__(self):print('Gaussionnaivebayesmodel!')defgaussion_pdf(self,x_test,x):"""计算高斯正态分布下的条件概率Params:x_test(array):x(array):x属于同一类别的数据"""temp1=(x_test-x.mean(0))*(x_test-x.mean(0))temp2=x.std(0)*x.std(0)返回np.exp(-temp1/(2*temp2))/np.sqrt(2*np.pi*temp2)deffit(self,x_train,y_train):自我。x_train=x_train自我。y_train=y_traindefpredict(self,x_test,y_test=None):assertlen(x_test.shape)==2self.classes=np.unique(np.concatenate([y_train,y_test],0))pred_probs=[]#对于每个输入,计算它在self.classes中的i在每个类别中的概率:idx_i=self.y_train==i#计算P(y)p_y=len(idx_i)/len(self.y_train)#使用高斯概率密度函数计算P(x|y)p_x_y=np.prod(self.gaussion_pdf(x_test,self.x_train[idx_i]),1)#计算x,y的联合概率,P(x|y)P(y)prob_i=p_y*p_x_ypred_probs.append(prob_i)pred_probs=np.vstack(pred_probs)#取概率最高的类别label_idx=pred_probs.argmax(0)y_pred=self.classes[label_idx]ify_testisnotNone:self._score(y_test,y_pred)returny_preddef_score(self,y_test,y_pred):self.score=np.count_nonzero(y_test==y_pred)/len(y_test)下面是使用自定义模型和模型中的实验结果sklearn:朴素贝叶斯方法的参数估计和最大似然估计参考这篇博客这里解释似然和概率的区别:对于函数$P(x|\theta)$,x代表输入数据,$\theta$代表如果模型参数$\theta$已知,x为变量,那么这个函数就称为概率函数(Probabilityfunction),它描述的是它出现的概率对于不同的输入x如果x已知,$\theta$为变量,则该函数称为似然函数(Likelihoodfunction),它描述了x个样本对于不同模型参数出现的概率。最大似然估计适用于“模型固定,但参数未知”的情况。已知随机变量符合一定的概率分布模型,但模型的参数未知。最大似然估计的过程可以理解为:利用已知的样本数据,反推最有可能(最大概率)产生这些数据的模型参数。它的一般过程是:写出似然函数。取似然函数的对数并整理。取参数$\theta$的导数并将其设置为0。求解似然方程。这里我们先给出先验概率和条件概率的最大似然。先验概率$P(Y=c_k)$的最大似然为$$P(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N},k=1,2,...,N\tag{9}$$将第j个特征$x^{(j)}$的可能取值集合设为${a_{j1},a_{j2},。..,a_{jS_j}}$,条件概率$P(X^{(j)}=a_{jl}|Y=c_k)$的最大似然估计为$$\begin{split}P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^NI(x_i^j=a_{jl},y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)}\\j=1,2,...,n;l=1,2,...,s_j;k=1,2,...,K\end{split}\tag{10}$$式(10)中,$x_i^j$为第i个样本的第j个特征,$a_{jl}$表示第j个特征可能的第$l$个特征价值;$I$是指标函数。下面证明先验概率极大似然。我们可以假设Y的分布规律。设参数$P\{Y=c_k\}=\theta_k,k=1,2,...,K$。那么随机变量Y的分布规律可以表示为$$P(Y)=\sum_{k=1}^K\theta_kI(Y=c_k)\tag{11}$$,则样本$y_i\在Y中可以得到$的概率为$$P(y_i)=\sum_{k=1}^K\theta_kI(c_k=y_i)\tag{12}\\subject\quadto$$$$\sum_{k=1}^K\theta_k=1\tag{13}$$最大似然为$$L(y_1,y_2,...,y_N;\theta)=\prod_{i=1}^N\sum_{k=1}^K\theta_kI(c_k=y_i)=\prod_{k=1}^K\theta_k^{N_k}\tag{14}$$$N_k$表示类别$c_k$的个数Y,对(14)取对数得到$$InL=\sum_{k=1}^KN_kIn(\theta_k)\tag{15}$$根据等式约束(13),用拉格朗日算子求解:$$L(\theta,\lambda)=\sum_{k=1}^KN_kIn(\theta_k)+\lambda(\sum_{k=1}^K\theta_k-1)\tag{16}$$分别求$\theta$和$\lambda$的导数,设导数为0:$$\begin{cases}\frac{N_1}{\theta_1}+\lambda&=0\\\frac{N_2};{\theta_2}+\lambda&=0\\...\\\frac{N_K}{\theta_K}+\lambda&=0\\\sum_{k=1}^K\theta_k&=1\\\sum_{k=1}^KN_k&=N\end{cases}\tag{17}$$可以通过求解得到:$\theta_k=\frac{N_k}{N}$,即$P(Y=c_k)$$P(Y=c_k)=\frac{的最大似然不再将参数$\theta$视为未知的确定性变量,而将估计参数视为符合某种先验概率分布的随机变量。。。。期望$P(\theta|D)$在真正的$\theta$值处有一个极值。贝叶斯估计的主要步骤如下根据训练样本$D=\{x_1,x_2,...,x_N\}$确定参数$\theta$先验分布$P(\theta)$求样本条件分布$P(D|\theta)$。$P(D|\theta)=\prod_{i=0}^NP(x_i|\theta)$。使用贝叶斯公式计算$\theta$的后验概率:$$P(\theta|D)=\frac{P(D|\theta)P(\theta)}{\int_\thetaP(D|\theta)P(\theta)d\theta}\tag{18}$$得到贝叶斯估计$$\hat{\theta}=\int_\theta\thetaP(\theta|D)d\theta\tag{19}$$在公式(18)中,由于参数$\theta$是随机分布的,我们需要考虑$\theta$的每一种情况,然后计算积分。大量的积分运算使贝叶斯估计变得复杂。最大后验概率估计(Maximumaposterior,MAP)是贝叶斯估计的简化,通过最大化后验概率得到参数$\theta$。最大化后验概率类似于最大似然,即最大化式(18),式(18)的分母为归一化因子,即最大化分子:$$\theta_{MAP}=\arg\max_{\theta}\prod_{i=1}^{n}p(x_i|\theta)p(\theta)\tag{20}$$上面的公式和最大似然函数很相似,但是有一个额外的测试概率。总结朴素贝叶斯的基本假设是条件独立性,这是一个强假。由于这个假设,模型中包含的条件概率数量大大减少,朴素贝叶斯的学习和预测也大大简化。因此,朴素贝叶斯方法高效且易于实现。它的缺点是分类性能不一定很高。朴素贝叶斯将实例分类为具有最大后验概率的类。这相当于最小化预期风险。根据最小化期望风险的准则,得到最大化后验概率的准则。$f(x)=argmax_{c_k}P(c_k|X=x)$贝叶斯公式可以写成下面的形式,Hypothesis表示一个假设(例如:今天被领导批评),Evidence表示证明的证据可能会导致假设(例如:上班迟到)。贝叶斯理论认为,Evidence不能确定后验概率,只能不断更新。$$P(Hypothesis|Evidence)=\frac{P(Hypothesis)P(Evidence|Hypothesis)}{P(Evidence)}$$参数估计时,MLE最大化$P(Evidence|Hypothesis)$,MAP最大化$P(Hypothesis)P(Evidence|Hypothesis)$,而贝叶斯估计将$P(Hypothesis)$作为一个符合一定分布的随机变量,通过观察数据来估计后验分布。并通过后验分布进行群体决策。MLE不考虑先验,而MAP和贝叶斯估计都考虑先验。MAP可以看作是贝叶斯估计的简化。当样本数趋近于无穷时,MLE等价于MAP。参考李航《统计学习方法》朴素贝叶斯参数估计详解最大似然估计(MLE),最大后验概率估计(MAP),以及贝叶斯公式贝叶斯定理的理解,让概率直观化(很棒的视频)MLE,MAP,贝叶斯estimationinmachinelearning贝叶斯估计详解
