朴素贝叶斯法

朴素贝叶斯(naive Bayes)法是基于贝叶斯定理特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法。

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

基本方法

设输入空间$x \subseteq R^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}$$

朴素贝叶斯分类的代码实现

这里还是用iris数据集为例,假设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}$表示$y=c_k$对应的x的均值。

# ------------------ 加载数据 ------------------ #
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

# -------------- 朴素贝叶斯分类模型 -------------- #
class NaiveBayes:
    def __init__(self):
        print('Gaussion naive bayes model!')

    def gaussion_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)
        return np.exp(-temp1 / (2 * temp2)) / np.sqrt(2 * np.pi * temp2)

    
    def fit(self, x_train, y_train):
        self.x_train = x_train
        self.y_train = y_train


    def predict(self, x_test, y_test=None):
        assert len(x_test.shape) == 2
        self.classes = np.unique(np.concatenate([y_train, y_test], 0))
        pred_probs = []
        
        # 对于每个输入,计算其处于每个类别的概率
        for i in self.classes:
            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_y

            pred_probs.append(prob_i)
        
        pred_probs = np.vstack(pred_probs)
        
        # 取具有最高概率的类别
        label_idx = pred_probs.argmax(0)
        y_pred = self.classes[label_idx]
        if y_test is not None:
            self._score(y_test, y_pred)
        return y_pred
        
    
    def _score(self, y_test, y_pred):
        self.score = np.count_nonzero(y_test == y_pred)/len(y_test)
        

下面是分别使用自定义模型和sklearn中的模型的实验结果:
image.png

朴素贝叶斯法的参数估计

极大似然估计

这里参考这篇博客,解释一下似然和概率的区别:

对于函数$P(x|\theta)$,x表示输入数据,$\theta$表示模型参数
如果$\theta$已知,x为变量,则该函数叫做概率函数(Probability function),它描述了对不同输入x,其出现的概率。
如果x已知,$\theta$为变量,则该函数叫做似然函数(Likelihood function),它描述了对于不同模型参数下,x样本出现的概率。
极大似然估计适用于"模型已定,参数未知"情况。已知随机变量符合某种概率分布模型,但模型的参数并不知道。极大似然估计的过程可以理解为:利用已知的样本数据,反推最有可能(概率最大)产生这些数据出现的模型参数

它的一般过程是:

  1. 写出似然函数。
  2. 对似然函数取对数并整理。
  3. 对参数$\theta$求导,并令其等于0。
  4. 求解似然方程。

这里先给出先验概率和条件概率的极大似然。先验概率$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\in Y$的概率为

$$P(y_i)=\sum_{k=1}^K\theta_kI(c_k=y_i) \tag{12} \\ subject \quad to $$$$\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$表示Y中类别为$c_k$的数目,对式(14)取对数得

$$InL=\sum_{k=1}^KN_kIn(\theta_k)\tag{15}$$

根据等式约束(13),使用拉格朗日算子进行求解:

$$L(\theta,\lambda)=\sum_{k=1}^KN_k In(\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{N_k}{N}$

贝叶斯估计

不同于极大似然估计,不再把参数$\theta$看做是未知的确定变量,而将带估计的参数看做是符合某种先验概率分布的随机变量。

绘图2.png

期望$P(\theta|D)$在真实的$\theta$值处有一个极值。

贝叶斯估计的主要步骤如下

  1. 确定参数$\theta$先验分布$P(\theta)$
  2. 根据训练样本$D = \{x_1,x_2,...,x_N\}$求出样本条件分布$P(D|\theta)$。$P(D|\theta)=\prod_{i=0}^NP(x_i|\theta)$。
  3. 利用贝叶斯公式计算$\theta$的后验概率:

$$P(\theta|D)=\frac{P(D|\theta)P(\theta)}{\int_\theta P(D|\theta)P(\theta)d\theta}\tag{18}$$

  1. 得到贝叶斯估计值

$$\hat{\theta}=\int_\theta \theta P(\theta|D)d\theta\tag{19}$$

在式(18)中,由于参数$\theta$是随机分布的,我们需要考虑每一种$\theta$的情况,然后计算积分,大量的积分运算让贝叶斯估计变得复杂。而最大后验概率估计(Maximum a posterior, 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)$作为符合某种分布的随机变量,通过观测数据来估计后验分布(posterior distribution),并通过后验分布做群体决策。MLE不考虑先验,MAP和贝叶斯估计则都考虑了先验。MAP可以看做贝叶斯估计的简化。当样本数目接近无穷大时,MLE与MAP等效。

Reference

李航《统计学习方法》

朴素贝叶斯的参数估计

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

Bayes theorem, and making probability intuitive(非常棒的视频)

机器学习中的MLE、MAP、贝叶斯估计

贝叶斯估计详解


mhxin
84 声望15 粉丝