【机器学习算法】【7】--朴素贝叶斯

1. 引言


  朴素贝叶斯算法(Naive Bayes)是机器学习中常见的基本算法之一,主要用来做分类任务的。它是基于贝叶斯定理条件独立性假设的分类方法。对于给定的训练数据集,首先基于特征条件独立性假设学习输入/输出的联合概率分布然后基于此模型,对于给定的输入 x利用贝叶斯定理求出后验概率最大的输出 y 。 
   
基于以上的解释,我们知道:

1. 该算法的理论核心是贝叶斯定理;

2. 它是基于条件独立性假设这个强假设之下的,这也是该算法为什么称为“朴素”的原因。

前言:在了解朴素贝叶斯的算法之前,我们需要对相关的统计学知识做一个回顾。

     监督学习的任务就是学习一个模型,应用这一模型,对给定的输入预测相应的输出。这个模型的一般形式为决策函数:y=f(x)或者条件概率分布:p(y|x).。监督学习方法又可以分为生成方法和判别方法,所学到的模型分别是生成模型和判别模型

其中生成方法由数据学习联合概率分布p(x,y),然后求出条件概率p(y|x)作为预测的模型,即生成模型:

                                                                        p(y|x)=\frac{p(x,y)}{p(x)}

判别方法由数据直接学习决策函数f(x)或者 条件概率分布p(y|x)作为预测的模型即判别模型。

在理解朴素贝叶斯时,要注意一下几个方面:

  1. 朴素贝叶斯算法的数学原理;

  2. 朴素贝叶斯算法的参数估计;

  3. 拉普拉斯平滑;


一、统计学知识

我们先看看条件独立公式,如果X和Y相互独立,则有: 

                                                  P(X,Y)=P(X)P(Y)

我们接着看看条件概率公式:

                                                 P(Y|X)=P(X,Y)/P(X)

                                                 P(X|Y)=P(X,Y)/P(Y)

全概率公式:

                                                p(x)=\sum_{k=1}^{n}p(x|y_{k})\cdot p(y_{k}),\sum_{k=1}^{n}p_{k}=1

很容易得出贝叶斯公式:

二、朴素贝叶斯的模型

假如我们的分类模型样本是:

即我们有m个样本,每个样本有n个特征,特征输出有K个类别,定义为C1,C2,...,CK。

   从样本我们可以学习得到朴素贝叶斯的先验分布P(Y=Ck)(k=1,2,...K),接着学习到条件概率分布P(X=x|Y=Ck)=P(X1=x1,X2=x2,...Xn=xn|Y=Ck),然后我们就可以用贝叶斯公式得到X和Y的联合分布P(X,Y)了。联合分布P(X,Y)定义为:

        从上面的式子可以看出P(Y=Ck)比较容易通过最大似然法求出,得到的P(Y=Ck)就是类别Ck在训练集里面出现的频数。但是P(X1=x1,X2=x2,...Xn=xn|Y=Ck)很难求出,这是一个超级复杂的有n个维度的条件分布。朴素贝叶斯模型在这里做了一个大胆的假设,即X的n个维度之间相互独立,这样就可以得出:

        从上式可以看出,这个很难的条件分布大大的简化了,但是这也可能带来预测的不准确性。你会说如果我的特征之间非常不独立怎么办?如果真是非常不独立的话,那就尽量不要使用朴素贝叶斯模型了,考虑使用其他的分类方法比较好。但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。虽然我们牺牲了准确性,但是得到的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。

       最后回到我们要解决的问题,我们的问题是给定测试集的一个新样本特征(x_{1}^{test},x_{2}^{test},x_{3}^{test},...x_{n}^{test}),我们如何判断它属于哪个类型?

        既然是贝叶斯模型,当然是后验概率最大化来判断分类了。我们只要计算出所有的K个条件概率p(y=C_{k}|X=x^{test}),然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。

     (注意max与argmax的区别)

三、朴素贝叶斯的基本思想

 我们预测的类别Cresult是使P(Y=Ck|X=X(test))最大化的类别,数学表达式为:

 由于对于所有的类别计算P(Y=Ck|X=X(test))时,上式的分母是一样的,都是P(X=X(test),因此,我们的预测公式可以简化为:

接着我们利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:

故:贝叶斯是通过先验+似然=后验来推断问题的,而先验知识是非常重要的。

四、朴素贝叶斯的参数估计

在上一节中,我们知道只要求出p(y=C_{k})p(X_{j}=x_{j}^{test}|y=C_{k}),我们通过比较就可以得到朴素贝叶斯的推断结果。这一节我们就讨论怎么通过训练集计算这两个概率

  • 对于p(y=C_{k}),比较简单,通过极大似然估计我们很容易得到p(y=C_{k})为样本类别Ck出现的频率,即样本类别Ck出现的次数mk除以样本总数m。
  • 对于p(X_{j}=x_{j}^{test}|y=C_{k}),这个取决于我们的先验条件:

       a) 如果我们的Xj是离散的值,那么我们可以假设Xj符合多项式分布,这样得到p(X_{j}=x_{j}^{test}|y=C_{k}) 是在样本类别Ck中,               X_{j}^{test}出现的频率。即:

           其中mk为样本类别Ck出现的次数,而m_{kj}^{test}为类别为Ck的样本中,第j维特征X_{j}^{test}出现的次数。其中多项式分布的数据特            征如下图所示的。

        某些时候,可能某些特征在样本中没有出现,这样可能导致p(X_{j}=x_{j}^{test}|y=C_{k})为0,这样会影响后验的估计,为了解决           这种情况,我们引入了拉普拉斯平滑,即此时有:

        其中λ为一个大于0的常数,常常取为1。Oj为第j个特征的取值个数。

       b)如果我们我们的Xj是非常稀疏的离散值,即各个特征出现概率很低,这时我们可以假设Xj符合伯努利分布,即特征Xj出现          记为1,不出现记为0。即只要Xj出现即可,我们不关注Xj的次数。这样得到p(X_{j}=x_{j}^{test}|y=C_{k})是在样本类别Ck中,                 X_{j}^{test}出现的频率。此时有:

      其中伯努利分布的数据特征如下图所示的。

    c)如果我们我们的Xj是连续值,我们通常取Xj的先验概率为正态分布(高斯分布),即在样本类别Ck中,Xj的值符合正态分布。          这样p(X_{j}=x_{j}^{test}|y=C_{k})的概率分布是:

     其中\mu _{k}\sigma _{k}^{2}是正态分布的期望和方差,可以通过极大似然估计求得。\mu _{k}为在样本类别Ck中,所有Xj的平均值。\sigma _{k}^{2}为在样本类        别Ck中,所有Xj的方差。对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。

     其中高斯分布的数据特征如下图所示的。

五、贝叶斯算法过程

 我们假设训练集为m个样本n个维度,如下:

       共有K个特征输出类别,分别为C1,C2,...,CK,每个特征输出类别的样本个数为m1,m2,...,mK,在第k个类别中,如果是离散特征,则特征Xj各个类别取值为m_{jl}。其中l取值为1,2,...Sj,Sj为特征j不同的取值数。

    输出为实例X(test)的分类。

    算法流程如下:

  1) 如果没有Y的先验概率,则计算Y的K个先验概率:P(Y=Ck)=(mk+λ)/(m+Kλ),否则P(Y=Ck)为输入的先验概率。

    2) 分别计算第k个类别的第j维特征的第l个个取值条件概率:p(X_{j}=x_{jl}|Y=C_{k})

         a)如果是离散值:

         λ可以取值为1,或者其他大于0的数字。

        b)如果是稀疏二项离散值:

        此时l只有两种取值。

      c)如果是连续值不需要计算各个l的取值概率,直接求正态分布的参数:

   需要求出\mu _{k}\sigma _{k}^{2}。 \mu _{k}为在样本类别Ck中,所有Xj的平均值。\sigma _{k}^{2}为在样本类别Ck中,所有Xj的方差。

     3)对于实例X^{test},分别计算:

   4)确定实例X^{test}的分类Cresult

六、贝叶斯参数

如图,贝叶斯主要的有这三种,我们以sklearn.naive_bayes.MultinomialNB为例来进行说明。

class sklearn.naive_bayes.MultinomialNB(alpha=1.0fit_prior=Trueclass_prior=None)

Parameters:

alpha : float, optional (default=1.0)

Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing).

(拉普拉斯/Lidstone)平滑参数(0表示没有平滑)。

fit_prior : boolean, optional (default=True)

Whether to learn class prior probabilities or not. If false, a uniform prior will be used.

是否学习类先验概率。如果为假,则使用统一先验。

class_prior : array-like, size (n_classes,), optional (default=None)

Prior probabilities of the classes. If specified the priors are not adjusted according to the data.

Attributes:

class_log_prior_ : array, shape (n_classes, )

Smoothed empirical log probability for each class.

intercept_ : property

Mirrors class_log_prior_ for interpreting MultinomialNB as a linear model.

feature_log_prob_ : array, shape (n_classes, n_features)

Empirical log probability of features given a class, P(x_i|y).

coef_ : property

Mirrors feature_log_prob_ for interpreting MultinomialNB as a linear model.

class_count_ : array, shape (n_classes,)

Number of samples encountered for each class during fitting. This value is weighted by the sample weight when provided.

feature_count_ : array, shape (n_classes, n_features)

Number of samples encountered for each (class, feature) during fitting. This value is weighted by the sample weight when provided.

七、朴素贝叶斯算法小结

 朴素贝叶斯算法的主要原理基本已经做了总结,这里对朴素贝叶斯的优缺点做一个总结。

   朴素贝叶斯的主要优点有:

   1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

   2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

   3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

   朴素贝叶斯的主要缺点有:   

   1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

   2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。贝叶斯时通过先验+似然=后验来推断问题的,而先验知识是非常重要的。

   3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

   4)对输入数据的表达形式很敏感。

参考资料:

https://www.cnblogs.com/pinard/p/6069267.html

https://www.cnblogs.com/lliuye/p/9178090.html

猜你喜欢

转载自blog.csdn.net/qq_20412595/article/details/82146598
今日推荐