导航:首页 > 源码编译 > 朴素贝叶斯算法思想

朴素贝叶斯算法思想

发布时间:2022-12-12 10:54:50

A. 朴素贝叶斯(Naive Bayes)算法

朴素贝叶斯算法属于分类算法。发源于古典数学理论,对缺失数据不太敏感,有稳定的分类效率,模型所需估计的参数很少,算法比较简单。

朴素贝叶斯算法 贝叶斯 是说明这个算法和贝叶斯定理有联系,而 朴素 是因为处理实际的需要,做了一个简化—— 假设每个特征之间是独立的 (如果研究的对象互相之间的影响很强,计算概率时考虑的问题非常复杂,做了独立假设,就可以分解后进行研究),这是这个算法模型与贝叶斯定理的区别。

将 x 作为特征,y 作为类别,那公式左边的 P(yi|x)就是说在知道特征 x 的情况下,计算这个特征属于 yi 类的可能性大小。通过比较找出这个可能性的值最大的属于哪一类,就将特征 x 归为这一类。

第3步的计算就是整个关键所在,计算依据是上面的贝叶斯公式。

对于每一个类的概率计算,公式右边的分母的 P(x)都是相同的,所以可以不计算(我们只是对最终结果进行比较,不影响)。

P(yi)也称为先验概率,是 x 属于 yi 类的一个概率,这个是通过历史信息得到的(在程序实现的时候,历史信息或者说先验信息就是我们的训练数据集),我们通过对训练样本数据进行统计,分别算出 x 属于 y1,y2,...,yn 类的概率是多少,这个是比较容易得到的。

所以,主要是求 P(x|yi)= P(a1,a2,...,am|yi)

这个时候对于贝叶斯模型的 朴素 的独立性假设就发挥作用了(综合的计算变成了独立计算后的综合,简化模型,极大地减少了计算的复杂程度):

P(a1,a2,...,am|yi) = P(a1|yi)P(a2|yi)...P(am|yi)

所以计算想要得到的东西如下:

一个程序简例

B. 数据挖掘十大经典算法之朴素贝叶斯

朴素贝叶斯,它是一种简单但极为强大的预测建模算法。之所以称为朴素贝叶斯,**是因为它假设每个输入变量是独立的。**这个假设很硬,现实生活中根本不满足,但是这项技术对于绝大部分的复杂问题仍然非常有效。

贝叶斯原理、贝叶斯分类和朴素贝叶斯这三者之间是有区别的。

贝叶斯原理是最大的概念,它解决了概率论中“逆向概率”的问题,在这个理论基础上,人们设计出了贝叶斯分类器,朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最常用的分类器。朴素贝叶斯之所以朴素是因为它假设属性是相互独立的,因此对实际情况有所约束,**如果属性之间存在关联,分类准确率会降低。**不过好在对于大部分情况下,朴素贝叶斯的分类效果都不错。

朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法,换而言之朴素贝叶斯模型能工作并没有用到贝叶斯概率或者任何贝叶斯模型。

朴素贝叶斯分类 常用于文本分类 ,尤其是对于英文等语言来说,分类效果很好。它常用于垃圾文本过滤、情感预测、推荐系统等。

1、 需要知道先验概率 

先验概率是计算后验概率的基础。在传统的概率理论中,先验概率可以由大量的重复实验所获得的各类样本出现的频率来近似获得,其基础是“大数定律”,这一思想称为“频率主义”。而在称为“贝叶斯主义”的数理统计学派中,他们认为时间是单向的,许多事件的发生不具有可重复性,因此先验概率只能根据对置信度的主观判定来给出,也可以说由“信仰”来确定。 

2、按照获得的信息对先验概率进行修正 

在没有获得任何信息的时候,如果要进行分类判别,只能依据各类存在的先验概率,将样本划分到先验概率大的一类中。而在获得了更多关于样本特征的信息后,可以依照贝叶斯公式对先验概率进行修正,得到后验概率,提高分类决策的准确性和置信度。 

3、分类决策存在错误率 

由于贝叶斯分类是在样本取得某特征值时对它属于各类的概率进行推测,并无法获得样本真实的类别归属情况,所以分类决策一定存在错误率,即使错误率很低,分类错误的情况也可能发生。 

第一阶段:准备阶段

在这个阶段我们需要确定特征属性,同时明确预测值是什么。并对每个特征属性进行适当划分,然后由人工对一部分数据进行分类,形成训练样本。

第二阶段:训练阶段

这个阶段就是生成分类器,主要工作是 计算每个类别在训练样本中的出现频率 及 每个特征属性划分对每个类别的条件概率。

第三阶段:应用阶段

这个阶段是使用分类器对新数据进行分类。

优点:

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

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

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

缺点:

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

(2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

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

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

参考:

https://blog.csdn.net/qiu__liao/article/details/90671932

https://blog.csdn.net/u011067360/article/details/24368085

C. 朴素贝叶斯算法的原理是什么

朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型。


朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。

最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。

同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。

朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。

朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。

虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。



D. 朴素贝叶斯以及三种常见模型推导

朴素贝叶斯算法Naive Bayes定义中有两个关键定义:特征之间强假设独立和贝叶斯定理.这两个定义就是朴素贝叶斯的关键.接下来先了解一下这两个定义.

贝叶斯定义是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关.

通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的,然而,这两者之间是有确定的关系的,贝叶斯定理就是这种关系的陈述。贝叶斯公式的一个用途在于通过已知的三个概率函数推出第四个.

直接给出公式:

其中,P(A|B)是指事件B发生的情况下事件A发生的概率(条件概率).在贝叶斯定理中,每个名词都有约定俗成的名称:

按这些术语,贝叶斯定理可以表述为:

后验概率 = (似然性 * 先验概率)/标准化常量

也就是说,后验概率与先验概率和相似度的乘积成正比.

同时,分母P(B),可以根据全概率公式分解为:

如果P(X,Y|Z)=P(X|Z)P(Y|Z),或等价地P(X|Y,Z)=P(X|Z),则称事件X,Y对于给定事件Z是条件独立的,也就是说,当Z发生时,X发生与否与Y发生与否是无关的。

应用在自然语言处理中,就是说在文章类别确定的条件下,文章的各个特征(单词)在类别确定的条件下是独立的,并不相关,用通俗的话说,在文章类别确定的条件下,文章各个词之间出现与否没有相关性(事实上,并不成立).这是一个非常强的假设,但对问题的求解来说变得更加简单.

设输入空间 为n为向量的集合,输出空间为类标记集合 .输入为特征向量 ,输出为类标记 . X是定义在输入空间X上的随机变量,Y是定义在输出空间Y上的随机变量.P(X,Y)是X和Y的联合概率分布.训练数据集:

由P(X,Y)独立同分布产生.因此朴素贝叶斯模型也是一个生成模型.

朴素贝叶斯算法通过训练集学习联合概率分布P(X,Y),具体地,学习先验概率分布以及条件概率分布.其中先验概率分布

条件概率分布

, k=1,2,...,K

通过两个概率得到联合概率分布P(X,Y) = P(X|Y)P(Y).

条件概率分布P(X=x|Y=c_k)有指数级数量的参数,其估计实际上不可行的.假设 有 个取值,j=1,2,...,n,Y有K个取值,那么参数个数为 .

指数级的参数估计事实上并不可行,因此朴素贝叶斯算法针对各个特征之间做了假设,也就是对条件概率分布作了条件独立性假设,这是一个很强的假设,通过这个假设,我们的参数求解变得可行,这也就是朴素贝叶斯的"朴素"的由来.这种情况下,我们同样假设 有 个取值,j=1,2,...,n,Y有K个取值,那么参数个数为 ,需要估计的参数量大大减少.条件独立性假设是

朴素贝叶斯算法分类时,对给定输入x,通过学习到的模型计算后验概率分布 ,将后验概率最大的类作为输入x的类输出.后验概率根据贝叶斯定理计算:

上面的公式是后验概率分布中的一项,由于对于相同输入x下不同类别的后验概率的分母都相同,而最终的类输出是后验概率分布中概率最大对应的类别,所以我们可以简化为只比较分子的大小就可以确定最终的结果,也就是说,最终类输出为:

.

如果我们对右边的乘积概率取log,连乘积就可以转换成为和,计算更简单(加法总比乘法简单),上诉公式存在一种变种:

.

同时这种形式,也可以看做是一种线性回归,权重系数为1.

介绍完,朴素贝叶斯的概率模型之后,我们目前的主要问题就集中在如何估计这个模型的 个参数: ,估算出参数,我们就可以对输入向量x做预测.针对这些参数的求解方法不同,存在不同的朴素贝叶斯类型,具体介绍三种:伯努利朴素贝叶斯,多项式朴素贝叶斯和高斯朴素贝叶斯.不同类型的朴素贝叶斯对参数的求法不同,而根源在于对P条件概率(X=x|Y=c_k)的假设分布不同,也就是说在给定类别的情况下,对X假设的分布不同:伯努利假设是伯努利分布(其实应该是多变量伯努利分布),多项式假设是多项式分布,而高斯也就是假设是高斯分布(其实是多变量高斯分布).然后,我们细化到三种不同类型的朴素贝叶斯理论中.

伯努利朴素贝叶斯,其实应该叫"Multi-variate Naive Bayes",假设P(X=x|Y=c_k)是多变量伯努利分布.在了解多变量伯努利分布之前,先介绍一下什么是(单变量的)伯努利分布.

伯努利分布,又叫做两点分布或0-1分布,是一个离散型概率分布.称随机变量X有伯努利分布,参数为p(0< p <1),它分别以概率p和1-p取1和0为值.

最简单的例子就是抛硬币,硬币结果为正或反.

幂次运算变成乘法运算,更简单.当x=1时,概率是P(X=1)=p,当x=0时,概率P(X=0)=1-p,这样就可以将两种情况合在一起.

了解了什么是伯努利分布之后,我们再看什么是多元伯努利分布(多变量 multi-variate Bernoulli).

多元伯努利分布,通俗的讲就是同时进行多个不同的伯努利实验, ,其中x是一个向量, 也是一个向量,表示不同伯努利实验的参数.

伯努利多项式将文档的生成模型P(X=x|Y=c_k)假设服从为多元伯努利分布,由于我们之前做的特征独立性假设, 是一个向量形式,而其中 ,也就是说x向量是onehot形式的向量(每个维度值是0或1),表示这个维度的特征是否出现.特征集 有n个特征,特征集的维度决定了输入空间X的维度,而且特征集的维度可以对应到输入空间的各个维度上.

因为特征之间的独立性,所以多元伯努利变成各个伯努利分布的连乘积,需要注意的一点是 因为是伯努利分布,0-1,特征出现有一个概率p,特征不出现也有一个概率1-p .最终模型的参数估计完成之后,对新样本进行预测时,如果某个特征不出现,需要 乘上这个特征不出现的概率 ,不能只计算特征出现的概率!!!两个向量直接相乘,并不能得到最终的结果.

对应的伯努利朴素贝叶斯模型为:

为了简化运算,我们可以将分母忽略,虽然对应的结果不是真正的概率,但是相同样本的各个后验概率之间的大小关系保持不变,同时如果两边同时做log运算,后验概率之间的大小关系同样保持不变.因此,

.

了解了多元伯努利分布之后,接下来的工作就是对参数进行估计,计算 , .

参数估计的过程也是朴素贝叶斯分类器学习的过程.而参数估计可以使用极大似然估计.先验概率 的极大似然估计是

, k=1,2,...,K

其中,I(x)是一个指示函数,如果x为真,I(x)结果为1,如果x为假,I(x)=0.用语言描述来说, 这个概率等于在N个样本的数据集中,类别为 的样本所占的比例.

条件概率 的极大似然估计是:

用语言描述来说,条件概率 等于在类别为 的样本集合(数据集的子集)中,第i个特征等于 的概率, 是0或1,而且 服从伯努利分布,所以只需要计算一个,比如P , ,因为两个概率和为1(这是 同一个变量 ).

这些参数估计完之后,朴素贝叶斯就完成了学习过程,接下来就可以使用它去进行预测了(应用才是最终的目的).

由于 是伯努利分布,参数p在[0,1]之间,有可能存在 ,也就是存在0概率.

举例来说,在当前类别下的所有样本中特征i都出现了(=1),根据上面的条件概率极大似然估计,可以知道 ,那么对应的, ,那么当新样本来的时候,加入存在一条记录x,它很巧地没有第i个特征(这不巧了吗?不是),由于0概率的存在,那么使用上面的贝叶斯公式,就会出现属于某个列别的概率为0, .但这种情况是应该避免的,那么如何避免呢?

我们在对条件概率进行极大似然估计时,针对分子和分母做一些小变动,

其中, 表示第i个特征不同取值的个数,由于这里是one-hot,取值为2,所以 , 乘以 是保证 个不同取值对应的条件概率之和为1,不偏袒任意一种情况,一视同仁.

To Be Continued.

多项式朴素贝叶斯,假设P(X=x|Y=c_k)是多项式分布.在了解多项式朴素贝叶斯之前,先介绍一下什么是多项式分布?

将伯努利分布的单变量扩展到d维向量 ,其中 ,且 ,假设 的概率是 ,并且 ,则将得到离散分布:

.

其中x, 都是d维向量形式.在此的基础上扩展二项分布到多项式分布(Multinomial distribution),该分布描述的是在n次独立实验中有 词 的概率,其密度函数可以表达为如下形式:

多项式分布的期望,方差如下:

多项式分布应用到朴素贝叶斯上,对于文档分类问题来说,假设给定文档类型的基础上文档生成模型 是一个多项式分布.这样对应关系就是:

需要注意的是,应用在文本分类的多项式朴素贝叶斯模型之前,一般多项式条件概率如下:

我们的多项式朴素贝叶斯概率模型为:

这里为了方便,首先我们假设文章长度和文章的类别之间没有相关性(事实上也并不成立,比如说相对较长的邮件,相比垃圾邮件而言,正常邮件的概率更大),也就是说P(|x|)的分布与文章所属类别无关.另一方面,由于最终所属类别是后验概率最大对应的类别,所以,我们可以将文章长度P(|x|)建模的概率,忽略掉,就像我们之前忽略伯努利分布中的分母一样.

再者,为了更加方便,我们通常对两边取log运算,将幂次运算转换成线性运算:

我们也可以将文章长度阶乘省略,然后变成:

.

这样就变成线性运算,就和线性回归一样,运算高效而简单.

将文档模型对应到多项式分布上得到多项式朴素贝叶斯,在我们对其做出假设分布之后,剩下的工作就是对假设分布下每个类别下的d个条件概率以及先验分布进行估计.此外,还需要说明的一点是:多项式朴素贝叶斯模型采用词袋模型,每个 表示第i个特征出现的次数,也就是词频term-frequency,有时候也可以使用tf-idf作为值.

参数估计的过程也是朴素贝叶斯分类器学习的过程.而参数估计可以使用极大似然估计.先验概率 的极大似然估计是

, k=1,2,...,K

其中,I(x)是一个指示函数,如果x为真,I(x)结果为1,如果x为假,I(x)=0.用语言描述来说, 这个概率等于在N个样本的数据集中,类别为 的样本所占的比例.

条件概率 的极大似然估计是:

用语言描述来说,条件概率 等于在类别为 的样本集合(数据集的子集)中,第t个特征出现的概率等于 类样本第t个特征出现的总次数(考虑词频,不再是0,1)占 类样本的总词数(文章长度之和,文章单词特征是固定的,考虑了词频)的比例.

为了方便理解,将 表示为第k类样本集合中第t个特征出现的总次数, 表示为在所有样本中第k类样本的总词数(第k类样本长度之和,考虑频数),简写成:

和伯努利朴素贝叶斯模型类似,有可能存在某一维度,数据集在这一维度上都是0,对应到文档分类上,就是这个词在所有文章中都没有出现过(词典选的不好,特征选择不好),这种情况就会出现0概率.所以我们需要对条件概率做一点小改动:

其中,d表示数据维度为d(有d个特征,每个特征都加 ,保证概率和为1, 需要乘d).当 时,叫做Laplace Smoonthing拉普拉斯平滑,当然 也可以小于1.

To Be Continued

高斯朴素贝叶斯,假设P(X=x|Y=c_k)是多元高斯分布.在了解高斯朴素贝叶斯之前,先介绍一下什么是高斯分布,什么是多元高斯分布?

高斯分布又称正态分布,在实际应用中最为广泛。对于单变量 ,高斯分布的参数有两个,分别是均值 和方差 ,其概率密度函数为

其中, 是D维均值向量, 是DxD的协方差矩阵, 是 的行列式.多元高斯分布的期望是 ,方差是

特殊的, 如果D个维度之间相互独立,那么多元高斯分布就可以表示成单元高斯分布概率密度函数的连乘积 .

高斯朴素贝叶斯模型是假设条件概率P(X=x|Y=c_k)是多元高斯分布,另一方面,由之前的特征的条件独立性假设,我们就可以通过对每个特征的条件概率建模, 每个特征的条件概率 也服从高斯分布 .

在 类下第i个词对应的高斯分布为:

其中, , 表示c类下第i个特征的均值和方差.

由于特征之间的独立性假设,我们可以得到条件概率:

一共有d个特征.

高斯朴素贝叶斯变成:

.

了解了多元高斯分布分布之后,接下来的工作就是对参数进行估计,计算 和 .

先验概率和之前的估算方法相同,不再描述.主要是对高斯分布的均值和方差的估计,采用的方法仍然是极大似然估计.

均值的估计 是在样本类别 中,所有 的平均值;

方差的估计 为样本类别 中所有 的方差.

对于一个连续的样本值,带入高斯分布,就可以求出它的概率分布了.

所有参数估计完成之后,就可以计算给定样本的条件概率 ,进而可以计算 ,之后就可以确定样本类别,完成模型预测.

E. 朴素贝叶斯

        在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,但是朴素贝叶斯却是生成方法。

如何理解这句话,看例题:

        根据上述数据集,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?

这里我们联系到朴素贝叶斯公式:

p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁)---------->要使这个公式成立,需要各个特征之间相互独立。

而朴素贝叶斯算法就是假设各个特征之间相互独立。

1、假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。

2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁)。我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。

        根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。

所以公式整理以后变为:

整理训练数据中,嫁的样本数如下:

分别计算各个概率:

p(嫁) = 6/12(总样本数) = 1/2

p(不帅|嫁) = 3/6 = 1/2

p(性格不好|嫁)= 1/6

p(矮|嫁) = 1/6

p(不上进|嫁) = 1/6

总样本为:

p(不帅) = 4/12 = 1/3

p(性格不好) = 4/12 = 1/3

p(身高矮) = 7/12

p(不上进) = 4/12 = 1/3

将以上概率带入公式,就能得出嫁的概率。

总结:理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

而在属性相关性较小时,朴素贝叶斯性能最 为良好。

F. 数据挖掘十大经典算法(1)——朴素贝叶斯(Naive Bayes)

在此推出一个算法系列的科普文章。我们大家在平时埋头工程类工作之余,也可以抽身对一些常见算法进行了解,这不仅可以帮助我们拓宽思路,从另一个维度加深对计算机技术领域的理解,做到触类旁通,同时也可以让我们搞清楚一些既熟悉又陌生的领域——比如数据挖掘、大数据、机器学习——的基本原理,揭开它们的神秘面纱,了解到其实很多看似高深的领域,其实背后依据的基础和原理也并不复杂。而且,掌握各类算法的特点、优劣和适用场景,是真正从事数据挖掘工作的重中之重。只有熟悉算法,才可能对纷繁复杂的现实问题合理建模,达到最佳预期效果。

本系列文章的目的是力求用最干练而生动的讲述方式,为大家讲解由国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 于2006年12月评选出的数据挖掘领域的十大经典算法。它们包括:

本文作为本系列的第一篇,在介绍具体算法之前,先简单为大家铺垫几个数据挖掘领域的常见概念:

在数据挖掘领域,按照算法本身的行为模式和使用目的,主要可以分为分类(classification),聚类(clustering)和回归(regression)几种,其中:

打几个不恰当的比方

另外,还有一个经常有人问起的问题,就是 数据挖掘 机器学习 这两个概念的区别,这里一句话阐明我自己的认识:机器学习是基础,数据挖掘是应用。机器学习研制出各种各样的算法,数据挖掘根据应用场景把这些算法合理运用起来,目的是达到最好的挖掘效果。

当然,以上的简单总结一定不够准确和严谨,更多的是为了方便大家理解打的比方。如果大家有更精当的理解,欢迎补充和交流。

好了,铺垫了这么多,现在终于进入正题!
作为本系列入门的第一篇,先为大家介绍一个容易理解又很有趣的算法—— 朴素贝叶斯

先站好队,朴素贝叶斯是一个典型的 有监督的分类算法

光从名字也可以想到,要想了解朴素贝叶斯,先要从 贝叶斯定理 说起。
贝叶斯定理是我们高中时代学过的一条概率学基础定理,它描述了条件概率的计算方式。不要怕已经把这些知识还给了体育老师,相信你一看公式就能想起来。

P(A|B)表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:

其中,P(AB)表示A和B同时发生的概率,P(B)标识B事件本身的概率。

贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A)。

而贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。
下面不加证明地直接给出贝叶斯定理:

有了贝叶斯定理这个基础,下面来看看朴素贝叶斯算法的基本思路。

你看,其思想就是这么的朴素。那么,属于每个分类的概率该怎么计算呢?下面我们先祭出形式化语言!

那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

如果你也跟我一样,对形式化语言有严重生理反应,不要怕,直接跳过前面这一坨,我们通过一个鲜活的例子,用人类的语言再解释一遍这个过程。

某个医院早上收了六个门诊病人,如下表。

现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他最有可能患有何种疾病?

本质上,这就是一个典型的分类问题, 症状 职业 是特征属性, 疾病种类 是目标类别

根据 贝叶斯定理

可得

假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了

这是可以计算的。

因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。

接下来,我们再举一个朴素贝叶斯算法在实际中经常被使用的场景的例子—— 文本分类器 ,通常会用来识别垃圾邮件。
首先,我们可以把一封邮件的内容抽象为由若干关键词组成的集合,这样是否包含每种关键词就成了一封邮件的特征值,而目标类别就是 属于垃圾邮件 不属于垃圾邮件

假设每个关键词在一封邮件里出现与否的概率相互之间是独立的,那么只要我们有若干已经标记为垃圾邮件和非垃圾邮件的样本作为训练集,那么就可以得出,在全部垃圾邮件(记为Trash)出现某个关键词Wi的概率,即 P(Wi|Trash)

而我们最重要回答的问题是,给定一封邮件内容M,它属于垃圾邮件的概率是多大,即 P(Trash|M)

根据贝叶斯定理,有

我们先来看分子:
P(M|Trash) 可以理解为在垃圾邮件这个范畴中遇见邮件M的概率,而一封邮件M是由若干单词Wi独立汇聚组成的,只要我们所掌握的单词样本足够多,因此就可以得到

这些值我们之前已经可以得到了。

再来看分子里的另一部分 P(Trash) ,这个值也就是垃圾邮件的总体概率,这个值显然很容易得到,用训练集中垃圾邮件数除以总数即可。

而对于分母来说,我们虽然也可以去计算它,但实际上已经没有必要了,因为我们要比较的 P(Trash|M) 和 P(non-Trash|M) 的分母都是一样的,因此只需要比较分子大小即可。

这样一来,我们就可以通过简单的计算,比较邮件M属于垃圾还是非垃圾二者谁的概率更大了。

朴素贝叶斯的英文叫做 Naive Bayes ,直译过来其实是 天真的贝叶斯 ,那么他到底天真在哪了呢?

这主要是因为朴素贝叶斯的基本假设是所有特征值之间都是相互独立的,这才使得概率直接相乘这种简单计算方式得以实现。然而在现实生活中,各个特征值之间往往存在一些关联,比如上面的例子,一篇文章中不同单词之间一定是有关联的,比如有些词总是容易同时出现。

因此,在经典朴素贝叶斯的基础上,还有更为灵活的建模方式—— 贝叶斯网络(Bayesian Belief Networks, BBN) ,可以单独指定特征值之间的是否独立。这里就不展开了,有兴趣的同学们可以做进一步了解。

最后我们来对这个经典算法做个点评:

优点:

缺点:

好了,对于 朴素贝叶斯 的介绍就到这里,不知道各位看完之后是否会对数据挖掘这个领域产生了一点兴趣了呢?

G. 朴素贝叶斯的推理学习算法

朴素贝叶斯的推理学习算法
贝叶斯公式简易推导式:
朴素贝叶斯的朴素在于假设B特征的每个值相互独立,所以朴素贝叶斯的公式是这样的
学习与分类算法:
(1)计算先验概率和条件概率
拉普拉斯平滑:
(2)代入被测样本向量,得到不同类别P,再根据后验概率最大化,取P最大的类别作为该标签类别。
朴素贝叶斯优点在于对于小规模数据很好,适合多分类。缺点是数据输入形式敏感而且特征值之间的相互独立很难保证带来的影响。

H. 第10天:NLP补充——朴素贝叶斯(Naive-Bayes)

1、引言
  贝叶斯方法是一个历史悠久,朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。当然有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来。因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口。
2、贝叶斯公式
贝叶斯公式其实很简单,但是很常用,就一行:

  而我们二分类问题的最终目的就是要判断 P(“属于某类”|“具有某特征”) 是否大于1/2就够了。贝叶斯方法把计算“具有某特征的条件下属于某类”的概率转换成需要计算“属于某类的条件下具有某特征”的概率,而后者获取方法就简单多了,我们只需要找到一些包含已知特征标签的样本,即可进行训练。而样本的类别标签都是明确的,所以贝叶斯方法在机器学习里属于有监督学习方法。
  这里再补充一下,一般‘先验概率’、‘后验概率’是相对出现的,比如 P(Y)与 P(Y|X) 是关于 Y的先验概率与后验概率, P(X)与 P(X|Y)是关于 X的先验概率与后验概率。
4、垃圾邮件识别
  我们可以通过一个例子来对邮件进行分类,识别垃圾邮件和普通邮件,如果我们选择使用朴素贝叶斯分类器,那目标就是判断 P(“垃圾邮件”|“具有某特征”) 是否大于1/2。现在假设我们有垃圾邮件和正常邮件各1万封作为训练集。需要判断以下这个邮件是否属于垃圾邮件:

也就是判断概率 P(“垃圾邮件”|“我司可办理正规发票(保真)17%增值税发票点数优惠!”)是否大于1/2。我们不难发现:通过上述的理解,也就是将其转换成的这个概率,计算的方法:就是写个计数器,然后+1 +1 +1统计出所有垃圾邮件和正常邮件中出现这句话的次数啊。也就是:

  于是当我们接触到了中文NLP中,其中最为重要的技术之一:分词!!!也就是把一整句话拆分成更细粒度的词语来进行表示。另外,分词之后去除标点符号、数字甚至无关成分(停用词)是特征预处理中的一项技术。我们观察(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”),这可以理解成一个向量:向量的每一维度都表示着该特征词在文本中的特定位置存在。这种将特征拆分成更小的单元,依据这些更灵活、更细粒度的特征进行判断的思维方式,在自然语言处理与机器学习中都是非常常见又有效的。因此贝叶斯公式就变成了:

1、朴素贝叶斯(Naive Bayes),“Naive”在何处?
  加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Naive Bayes)。将句子(“我”,“司”,“可”,“办理”,“正规发票”) 中的 (“我”,“司”)与(“正规发票”)调换一下顺序,就变成了一个新的句子(“正规发票”,“可”,“办理”, “我”, “司”)。新句子与旧句子的意思完全不同。但由于乘法交换律,朴素贝叶斯方法中算出来二者的条件概率完全一样!计算过程如下:

其中“发票”重复了三次。
3、处理重复词语的三种方式
(1)、多项式模型:
  如果我们考虑重复词语的情况,也就是说,重复的词语我们视为其出现多次,直接按条件独立假设的方式推导,则有:

统计计算 P(“词语”|S)时也是如此。

我们扫描一下训练集,发现“正规发票”这个词从出现过!!! ,于是 P(“正规发票”|S)=0 …问题严重了,整个概率都变成0了!!!朴素贝叶斯方法面对一堆0,很凄惨地失效了…更残酷的是这种情况其实很常见,因为哪怕训练集再大,也可能有覆盖不到的词语。本质上还是样本数量太少,不满足大数定律,计算出来的概率失真 *。为了解决这样的问题,一种分析思路就是直接不考虑这样的词语,但这种方法就相当于默认给P(“正规发票”|S)赋值为1。其实效果不太好,大量的统计信息给浪费掉了。我们进一步分析,既然可以默认赋值为1,为什么不能默认赋值为一个很小的数?这就是平滑技术的基本思路,依旧保持着一贯的作风,朴实/土但是直接而有效。对于伯努利模型,P(“正规发票”|S)的一种平滑算法是:

接下来的核心问题就是训练出一个靠谱的分类器。首先需要有打好标签的文本。这个好找,豆瓣影评上就有大量网友对之前电影的评价,并且对电影进行1星到5星的评价。我们可以认为3星以上的评论都是好评,3星以下的评论都是差评。这样就分别得到了好评差评两类的语料样本。剩下就可以用朴素贝叶斯方法进行训练了。基本思路如下:

但是由于自然语言的特点,在提取特征的过程当中,有一些tricks需要注意:

当然经过以上的处理,情感分析还是会有一部分误判。这里涉及到许多问题,都是情感分析的难点:

(2)、拼写纠错
  拼写纠错本质上也是一个分类问题。但按照错误类型不同,又分为两种情况:

真词错误复杂一些,我们将在接下来的文章中进行探讨。而对于非词错误,就可以直接采用贝叶斯方法,其基本思路如下:

训练样本1:该场景下的正常用词语料库,用于计算 P(候选词i)。

训练样本2:该场景下错误词与正确词对应关系的语料库,用于计算 P(错误词|候选词i)

当然,朴素贝叶斯也是有缺陷的。比如我们知道朴素贝叶斯的局限性来源于其条件独立假设,它将文本看成是词袋子模型,不考虑词语之间的顺序信息,例如:朴素贝叶斯会把“武松打死了老虎”与“老虎打死了武松”认作是一个意思。那么有没有一种方法提高其对词语顺序的识别能力呢?当然有,就是这里要提到的N-gram语言模型。接下来详细给大家介绍N-gram语言模型。

1、从假设性独立到联合概率链规则
 与我们之前我们垃圾邮件识别中的条件独立假设是一样的:

4、N-gram实际应用举例
(1)、词性标注
  词性标注是一个典型的多分类问题。常见的词性包括名词、动词、形容词、副词等。而一个词可能属于多种词性。如“爱”,可能是动词,可能是形容词,也可能是名词。但是一般来说,“爱”作为动词还是比较常见的。所以统一给“爱”分配为动词准确率也还足够高。这种最简单粗暴的思想非常好实现,如果准确率要求不高则也比较常用。它只需要基于词性标注语料库做一个统计就够了,连贝叶斯方法、最大似然法都不要用。词性标注语料库一般是由专业人员搜集好了的,长下面这个样子。其中斜线后面的字母表示一种词性,词性越多说明语料库分得越细;需要比较以下各概率的大小,选择概率最大的词性即可:

将公式进行以下改造,比较各概率的大小,选择概率最大的词性:

N-gram分类器是结合贝叶斯方法和语言模型的分类器。这里用 Y1,Y2分别表示这垃圾邮件和正常邮件,用 X表示被判断的邮件的句子。根据贝叶斯公式有:

比较这些概率的大小,找出使得 P(Yi|X)最大的 Yi即可得到 X 所属的分类(分词方案)了。Yi作为分词方案,其实就是个词串,比如(“我司”,“可”,“办理”,“正规发票”)(“我”,“司可办”,“理正规”,“发票”),也就是一个向量了。而上面贝叶斯公式中 P(X|Yi)项的意思就是在分类方案 Yi的前提下,其对应句子为 X的概率。而无论分词方案是(“我司”,“可”,“办理”,“正规发票”)还是(“我”,“司可办”,“理正规”,“发票”),或者其他什么方案,其对应的句子都是“我司可办理正规发票”。也就是说任意假想的一种分词方式之下生成的句子总是唯一的(只需把分词之间的分界符号扔掉剩下的内容都一样)。于是可以将 P(X|Yi)看作是恒等于1的。这样贝叶斯公式又进一步化简成为:

也就是说我们

I. 朴素贝叶斯算法

贝叶斯算法是由英国数学家托马斯·贝叶斯提出的,这个算法的提出是为了解决“逆向概率”的问题。首先我们先来解释下正向概率与逆向概率的含义:

正向概率 :假设一个箱子里有5个黄色球和5个白色球,随机从箱子里拿出一个球,请问取出的是黄球的概率是多少?很容易计算P(黄球)= N(黄球)/N(黄球)+ N(白球) = 5/5+5 = 1/2。
逆向概率 :起初我们并不知道箱子里有多少个球,我们依次从箱子里取出10个球,发现这个10个球中有7个白球,3个黄球,那么我们会根据我们观察到的结果去推测箱子里白球与黄球的分布比例大概是7:3,但是我们无法推测出箱子里的球的个数。

贝叶斯算法是一种基于概率统计的机器学习算法,它会计算出每种情况发生的概率,然后对其进行分类,贝叶斯算法经常用于文本分类问题和垃圾邮件过滤问题。假设有一篇新闻报道news report,我们使用贝叶斯算法来判断它们的类别,结果如下:
p(politics|news) = 0.2
p(entertainment|news) = 0.4
p(sports|news) = 0.7
因为p(sports|news)的概率最大,所以我们判断这篇新闻报道为体育类报道。“|”左边为要判断的类别,右边是我们给定的文章。

贝叶斯公式推导
接下来,我们将通过一个例子来推导贝叶斯公式。在一所学校里,男生和女生的比例分别是60%和40%,男生全部穿长裤,女生一半穿长裤,一半穿裙子。现迎面走来一个同学,你只能看清他(她)穿的是长裤,而无法分辨出他(她)的性别,请问他(她)是女生的概率?

下面我们逐步计算这个问题:
假设学校里的学生总数为N。
男生人数:N * P(boys),女生人数:N * P(girls)。
穿长裤的男生人数:N * P(boys) * P(pants|boys),其中P(pants|boys)是条件概率的表达形式,意思是男生中穿长裤的概率。因为男生都穿长裤,所以N * P(boys) * P(pants|boys) = 60% * N。
穿长裤的女生的人数:N * P(girs) * P(pants|girls) = 0.2 * N。
穿长裤的总人数:N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls)
穿长裤的同学是女生的概率:P(girl|pants) = N * P(girs) * P(pants|girls) / N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls) = P(girs)*P(pants|girls) / P(pants),分母用P(pants)表示穿长裤的概率。
最终结果:P(girl | pants) = P(pants | girl) * P(girl) / P(pants)
其中:P(girl)我们称为先验概率,是已知值,在这个例子中P(girl) = 40%。先验概率:根据以往的经验和分析得到的结果,先验概率和其他条件的影响不受样本影响。
P(girl | pants)我们称为后验概率,根据观察到的结果,去反推是女生的概率。
贝叶斯数学表达式

贝叶斯算法在垃圾邮件过滤中的应用
给定一封邮件,判定它是否属于垃圾邮件?用D 来表示这封邮件,注意D 由N 个单词组成。我们用h+ 来表示垃圾邮件,h-表示正常邮件。
有贝叶斯公式可得:
P(h+ | D) = P(D | h+) * P(h+) / P(D)
P(h- | D) = P(D | h-) * P(h-) / P(D)
其中P(h+),P(h-)为先验概率,假如我们有1000封邮件,其中有50封是垃圾邮件,其他都是正常邮件,那么P(h+),P(h-)的概率就是已知的。两个式子的分母都是P(D),所以P(D)对于最终结果的比较是没有影响的。接下来就是要求P(D | h+),P(D | h-)垃圾邮件中或正常邮件中是邮件D的概率。
我们都知道一封邮件是由许多词构成的,所以我们将P(D | h+)的表达式转化为P(d1,d2,d3......dn | h+),就是看垃圾邮件中出现d1,d2...dn这些词的概率是多少。
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 |d1,h+) * P(d3 |d1,d2,h+) ...
这个式子计算起来非常困难,所以在这里我们做一个假设,假设每个词都是独立的并且互不影响,那么这个式子就可以表示为:
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)
P(h+ | D) = {P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)}* P(h+) / P(D)
上述这个式子我们就称为朴素贝叶斯公式,朴素贝叶斯公式是对贝叶斯公式的简化,它建立在每个条子互相独立的基础上。
在现实生活中,我们写的每一句话中词与词之间肯定是有相互联系,如果没有联系,那么这句话是读不通的。那么为什么朴素贝叶斯能够在计算中使用,首先是计算简单,其次对最终结果的影响非常小。
参考资料
1.唐宇迪,《机器学习与数据分析实战》课程。
2.Peter,《机器学习实战》。

阅读全文

与朴素贝叶斯算法思想相关的资料

热点内容
大连php培训学校 浏览:979
怎么指定定向流量app的免流 浏览:900
华为云服务器有啥软件 浏览:654
礼记正义pdf 浏览:988
CorePDF 浏览:733
python多文件调用 浏览:329
linux如何用python 浏览:188
超易学的python 浏览:159
控制面板命令行 浏览:51
为什么空气难压缩是因为斥力吗 浏览:643
郭天祥单片机实验板 浏览:601
服务器有什么危害 浏览:258
饥荒怎么开新的独立服务器 浏览:753
文件夹变成了 浏览:560
linuxpython绿色版 浏览:431
怎么下载小爱同学音箱app 浏览:554
python占位符作用 浏览:76
javajdbcpdf 浏览:543
php网页模板下载 浏览:192
python试讲课pygame 浏览:409