黑马程序员技术交流社区

标题: 【上海校区】机器学习算法(7)之朴素贝叶斯 [打印本页]

作者: 不二晨    时间: 2018-10-19 09:52
标题: 【上海校区】机器学习算法(7)之朴素贝叶斯
1. 引言


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

基于以上的解释,我们知道:

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)

全概率公式:





很容易得出贝叶斯公式:



二、朴素贝叶斯的模型

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



即我们有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个维度之间相互独立,这样就可以得出:



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

       最后回到我们要解决的问题,我们的问题是给定测试集的一个新样本特征,我们如何判断它属于哪个类型?

        既然是贝叶斯模型,当然是后验概率最大化来判断分类了。我们只要计算出所有的K个条件概率,然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。



     (注意max与argmax的区别)

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

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



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



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



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

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

在上一节中,我们知道只要求出和,我们通过比较就可以得到朴素贝叶斯的推断结果。这一节我们就讨论怎么通过训练集计算这两个概率。

对于,比较简单,通过极大似然估计我们很容易得到为样本类别Ck出现的频率,即样本类别Ck出现的次数mk除以样本总数m。
对于,这个取决于我们的先验条件:
       a) 如果我们的Xj是离散的值,那么我们可以假设Xj符合多项式分布,这样得到 是在样本类别Ck中,               出现的频率。即:



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



        某些时候,可能某些特征在样本中没有出现,这样可能导致为0,这样会影响后验的估计,为了解决           这种情况,我们引入了拉普拉斯平滑,即此时有:



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

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



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



    c)如果我们我们的Xj是连续值,我们通常取Xj的先验概率为正态分布(高斯分布),即在样本类别Ck中,Xj的值符合正态分布。          这样的概率分布是:



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

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



五、贝叶斯算法过程

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



       共有K个特征输出类别,分别为C1,C2,...,CK,每个特征输出类别的样本个数为m1,m2,...,mK,在第k个类别中,如果是离散特征,则特征Xj各个类别取值为。其中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个个取值条件概率:

         a)如果是离散值:



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

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



        此时l只有两种取值。

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



   需要求出和。 为在样本类别Ck中,所有Xj的平均值。为在样本类别Ck中,所有Xj的方差。

     3)对于实例,分别计算:





   4)确定实例的分类Cresult



六、贝叶斯参数



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

class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_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://blog.csdn.net/qq_20412595/article/details/82146598



作者: 不二晨    时间: 2018-10-25 10:45

作者: 魔都黑马少年梦    时间: 2018-11-1 16:21





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2