贝叶斯分类算法

贝叶斯分类算法
贝叶斯分类算法

最近在面试中,除了基础& 算法& 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法,而我向来恨对一个东西只知其皮毛而不得深入,故写一个有关聚类& 分类算法的系列文章以作为自己备试之用(尽管貌似已无多大必要,但还是觉得应该写下以备将来常常回顾思考)。行文杂乱,但侥幸若能对读者也起到一定帮助,则幸甚至哉。

本分类& 聚类算法系列借鉴和参考了两本书,一本是Tom M.Mitchhell所著的机器学习,一本是数据挖掘导论,这两本书皆分别是机器学习& 数据挖掘领域的开山or杠鼎之作,读者有继续深入下去的兴趣的话,不妨在阅读本文之后,课后细细研读这两本书。除此之外,还参考了网上不少牛人的作品(文末已注明参考文献或链接),在此,皆一一表示感谢。

本分类& 聚类算法系列暂称之为Top 10 Algorithms in Data Mining,其中,各篇分别有以下具体内容:

1. 开篇:决策树学习Decision Tree,与贝叶斯分类算法(含隐马可夫模型HMM);

2. 第二篇:支持向量机SVM(support vector machine),与神经网络ANN;

3. 第三篇:待定...

说白了,一年多以前,我在本blog内写过一篇文章,叫做:数据挖掘领域十大经典算法初探(题外话:最初有个出版社的朋友便是因此文找到的我,尽管现在看来,我离出书日期仍是遥遥无期)。现在,我抽取其中几个最值得一写的几个算法每一个都写一遍,以期对其有个大致通透的了解。

OK,全系列任何一篇文章若有任何错误,漏洞,或不妥之处,还请读者们一定要随时不吝赐教& 指正,谢谢各位。

基础储备:分类与聚类

在讲具体的分类和聚类算法之前,有必要讲一下什么是分类,什么是聚类,都包含哪些具体算法或问题。

常见的分类与聚类算法

简单来说,自然语言处理中,我们经常提到的文本分类便就是一个分类问题,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:朴素的贝叶斯分类算法(native Bayesian classifier)、基于支持向量机(SVM)的分类器,k-最近邻法(k-nearest neighbor,

kNN),神经网络法,决策树分类法,模糊分类法等等(本篇稍后会讲决策树分类与贝叶斯分类算法,当然,所有这些分类算法日后在本blog内都会一一陆续阐述)。

而K均值聚类则是最典型的聚类算法。

监督学习与无监督学习

一般来说,机器学习方法分为监督学习方法,和无监督学习方法。举个具体的对应例子,则是比如说,在词义消岐中,也分为监督的消岐方法,和无监督的消岐方法。在有监督的消岐方法中,训练数据是已知的,即没歌词的语义分类是被标注了的;而在无监督的消岐方法中,训练数据是未经标注的。

有监督的学习也通常称为分类任务,而无监督的学习通常称为聚类任务。也就是说,分类属于监督学习,聚类属于无监督学习。

第一部分、决策树学习

1.1、什么是决策树

咱们直接切入正题。所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。

机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。

从数据产生决策树的机器学习技术叫做决策树学习, 通俗点说就是决策树。

来理论的太过抽象,下面举两个浅显易懂的例子:

第一个例子

套用俗语,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

女儿:多大年纪了?

母亲:26。

女儿:长的帅不帅?

母亲:挺帅的。

女儿:收入高不?

母亲:不算很高,中等情况。

女儿:是公务员不?

母亲:是,在税务局上班呢。

女儿:那好,我去见见。

这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑:

也就是说,决策树的简单策略就是,好比公司招聘面试过程中筛选一个人的简历,如果你的条件相当好比如说某985/211重点大学博士毕业,那么二话不说,直接叫过来面试,如果非重点大学毕业,但实际项目经验丰富,那么也要考虑叫过来面试一下,即所谓具体情况具体分析、决策。

第二个例子

此例子来自Tom M.Mitchell著的机器学习一书:

小王的目的是通过下周天气预报寻找什么时候人们会打高尔夫,他了解到人们决定是否打球的原因最主要取决于天气情况。而天气状况有晴,云和雨;气温用华氏温度表示;相对湿度用百分比;还有有无风。如此,我们便可以构造一棵决策树,如下(根据天气这个分类决策这天是否合适打网球):

上述决策树对应于以下表达式:

(Outlook=Sunny ^Humidity<=70)V (Outlook = Overcast)V (Outlook=Rain ^

Wind=Weak)

1.2、ID3算法

1.2.1、决策树学习之ID3算法

ID3算法是决策树算法的一种。想了解什么是ID3算法之前,我们得先明白一个概念:奥卡姆剃刀。

奥卡姆剃刀(Occam's Razor, Ockham's Razor),又称―奥坎的剃刀‖,是由14世纪逻辑学家、圣方济各会修士奥卡姆的威廉(William of Occam,约1285年至1349年)提出,他在《箴言书注》2卷15题说―切勿浪费较多东西,去做?用较少的东西,同样可以做好的事情‘。简单点说,便是:be simple。

ID3算法(Iterative Dichotomiser 3 迭代二叉树3代)是一个由Ross Quinlan发明的用于决策树的算法。这个算法便是建立在上述所介绍的奥卡姆剃刀的基础上:越是小型的决策树越优于大的决策树(be simple简单理论)。尽管如此,该算法也不是总是生成最小的树形结构,而是一个启发式算法。

OK,从信息论知识中我们知道,期望信息越小,信息增益越大,从而纯度越高。ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益(很快,由下文你就会知道信息增益又是怎么一回事)最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策树空间。

所以,ID3的思想便是:

1. 自顶向下的贪婪搜索遍历可能的决策树空间构造决策树(此方法是ID3算法和C4.5

算法的基础);

2. 从―哪一个属性将在树的根节点被测试‖开始;

3. 使用统计测试来确定每一个实例属性单独分类训练样例的能力,分类能力最好的属

性作为树的根结点测试。

4. 然后为根结点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支(也

就是说,样例的该属性值对应的分支)之下。

5. 重复这个过程,用每个分支结点关联的训练样例来选取在该点被测试的最佳属性。

这形成了对合格决策树的贪婪搜索,也就是算法从不回溯重新考虑以前的选择。

下图所示即是用于学习布尔函数的ID3算法概要:

1.2.2、哪个属性是最佳的分类属性

1、信息增益的度量标准:熵

上文中,我们提到:―ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益(很快,由下文你就会知道信息增益又是怎么一回事)最大的属性进行分裂。‖接下来,咱们就来看看这个信息增益是个什么概念(当然,在了解信息增益之前,你必须先理解:信息增益的度量标准:熵)。

上述的ID3算法的核心问题是选取在树的每个结点要测试的属性。我们希望选择的是最有利于分类实例的属性,信息增益(Information Gain)是用来衡量给定的属性区分训练样例的能力,而ID3算法在增长树的每一步使用信息增益从候选属性中选择属性。

为了精确地定义信息增益,我们先定义信息论中广泛使用的一个度量标准,称为熵(entropy),它刻画了任意样例集的纯度(purity)。给定包含关于某个目标概念的正反样例的样例集S,那么S相对这个布尔型分类的熵为:

上述公式中,p+代表正样例,比如在本文开头第二个例子中p+则意味着去打羽毛球,而p-则代表反样例,不去打球(在有关熵的所有计算中我们定义0log0为0)。

如果写代码实现熵的计算,则如下所示:

1.//根据具体属性和值来计算熵

2.double ComputeEntropy(vector > remain_state, string attribute, str

ing value,bool ifparent){

3. vector count (2,0);

4. unsigned int i,j;

5.bool done_flag = false;//哨兵值

6.for(j = 1; j < MAXLEN; j++){

7.if(done_flag) break;

8.if(!attribute_row[j].compare(attribute)){

9.for(i = 1; i < remain_state.size(); i++){

10.if((!ifparent&&!remain_state[i][j].compare(value)) || ifparent){//i

fparent记录是否算父节点

11.if(!remain_state[i][MAXLEN - 1].compare(yes)){

12. count[0]++;

13. }

14.else count[1]++;

15. }

16. }

17. done_flag = true;

18. }

19. }

20.if(count[0] == 0 || count[1] == 0 ) return 0;//全部是正实例或者负实例

21.//具体计算熵根据[+count[0],-count[1]],log2为底通过换底公式换成自然数底数

22.double sum = count[0] + count[1];

23.double entropy = -count[0]/sum*log(count[0]/sum)/log(2.0) - count[1]/sum*log(co

unt[1]/sum)/log(2.0);

24.return entropy;

25.}

举例来说,假设S是一个关于布尔概念的有14个样例的集合,它包括9个正例和5个反例(我们采用记号[9+,5-]来概括这样的数据样例),那么S相对于这个布尔样例的熵为:

Entropy([9+,5-])=-(9/14)log2(9/14)-(5/14)log2(5/14)=0.940。

So,根据上述这个公式,我们可以得到:S的所有成员属于同一类,Entropy(S)=0; S 的正反样例数量相等,Entropy(S)=1;S的正反样例数量不等,熵介于0,1之间,如下图所示:

信息论中对熵的一种解释,熵确定了要编码集合S中任意成员的分类所需要的最少二进制位数。更一般地,如果目标属性具有c个不同的值,那么S相对于c个状态的分类的熵定义为:

Pi为子集合中不同性(而二元分类即正样例和负样例)的样例的比例。

2、信息增益度量期望的熵降低

信息增益Gain(S,A)定义

已经有了熵作为衡量训练样例集合纯度的标准,现在可以定义属性分类训练数据的效力的度量标准。这个标准被称为―信息增益(information gain)”。简单的说,一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低(或者说,样本按照某属性划分时造成熵减少的期望)。更精确地讲,一个属性A相对样例集合S的信息增益Gain(S,A)被定义为:

其中 Values(A)是属性A所有可能值的集合,是S中属性A的值为v的子集。换句话来讲,Gain(S,A)是由于给定属性A的值而得到的关于目标函数值的信息。当对S的一个任意成员的目标值编码时,Gain(S,A)的值是在知道属性A的值后可以节省的二进制位数。

接下来,有必要提醒读者一下:关于下面这两个概念 or公式,

1.

2.

第一个Entropy(S)是熵定义,第二个则是信息增益Gain(S,A)的定义,而Gain(S,A)由第一个Entropy(S)计算出,记住了。

下面,举个例子,假定S是一套有关天气的训练样例,描述它的属性包括可能是具有Weak和Strong两个值的Wind。像前面一样,假定S包含14个样例,[9+,5-]。在这14

个样例中,假定正例中的6个和反例中的2个有Wind =Weak,其他的有Wind=Strong。由于按照属性Wind分类14个样例得到的信息增益可以计算如下。

运用在本文开头举得第二个根据天气情况是否决定打羽毛球的例子上,得到的最佳分类属性如下图所示:

在上图中,计算了两个不同属性:湿度(humidity)和风力(wind)的信息增益,最终humidity 这种分类的信息增益0.151>wind增益的0.048。说白了,就是在星期六上午是否适合打网球的问题诀策中,采取humidity较wind作为分类属性更佳,决策树由此而来。

1.//计算信息增益,DFS构建决策树

2.//current_node为当前的节点

3.//remain_state为剩余待分类的样例

4.//remian_attribute为剩余还没有考虑的属性

5.//返回根结点指针

6.Node * BulidDecisionTreeDFS(Node * p, vector > remain_state, vecto

r remain_attribute){

7.//if(remain_state.size() > 0){

8.//printv(remain_state);

9.//}

10.if (p == NULL)

11. p = new Node();

12.//先看搜索到树叶的情况

13.if (AllTheSameLabel(remain_state, yes)){

14. p->attribute = yes;

15.return p;

16. }

17.if (AllTheSameLabel(remain_state, no)){

18. p->attribute = no;

19.return p;

20. }

21.if(remain_attribute.size() == 0){//所有的属性均已经考虑完了,还没有分尽

22. string label = MostCommonLabel(remain_state);

23. p->attribute = label;

24.return p;

25. }

26.

27.double max_gain = 0, temp_gain;

28. vector ::iterator max_it;

29. vector ::iterator it1;

30.for(it1 = remain_attribute.begin(); it1 < remain_attribute.end(); it1++){

31. temp_gain = ComputeGain(remain_state, (*it1));

32.if(temp_gain > max_gain) {

33. max_gain = temp_gain;

34. max_it = it1;

35. }

36. }

37.//下面根据max_it指向的属性来划分当前样例,更新样例集和属性集

38. vector new_attribute;

39. vector > new_state;

40.for(vector ::iterator it2 = remain_attribute.begin(); it2 < remain_attr

ibute.end(); it2++){

41.if((*it2).compare(*max_it)) new_attribute.push_back(*it2);

42. }

43.//确定了最佳划分属性,注意保存

44. p->attribute = *max_it;

45. vector values = map_attribute_values[*max_it];

46.int attribue_num = FindAttriNumByName(*max_it);

47. new_state.push_back(attribute_row);

48.for(vector ::iterator it3 = values.begin(); it3 < values.end(); it3++){

49.for(unsigned int i = 1; i < remain_state.size(); i++){

50.if(!remain_state[i][attribue_num].compare(*it3)){

51. new_state.push_back(remain_state[i]);

52. }

53. }

54. Node * new_node = new Node();

55. new_node->arrived_value = *it3;

56.if(new_state.size() == 0){//表示当前没有这个分支的样例,当前的new_node为叶子节

57. new_node->attribute = MostCommonLabel(remain_state);

58. }

59.else

60. BulidDecisionTreeDFS(new_node, new_state, new_attribute);

61.//递归函数返回时即回溯时需要1 将新结点加入父节点孩子容器 2清除new_state容器

62. p->childs.push_back(new_node);

63. new_state.erase(new_state.begin()+1,new_state.end());//注意先清空new_state中

的前一个取值的样例,准备遍历下一个取值样例

64. }

65.return p;

66.}

1.2.3、ID3算法决策树的形成

OK,下图为ID3算法第一步后形成的部分决策树。这样综合起来看,就容易理解多了。

1、overcast样例必为正,所以为叶子结点,总为yes;

2、ID3无回溯,局部最优,而非全

局最优,还有另一种树后修剪决策树。下图是ID3算法第一步后形成的部分决策树:

如上图,训练样例被排列到对应的分支结点。分支Overcast的所有样例都是正例,所以成为目标分类为Yes的叶结点。另两个结点将被进一步展开,方法是按照新的样例子集选取信息增益最高的属性。

1.3、C4.5算法

1.3.1、ID3算法的改进:C4.5算法

C4.5,是机器学习算法中的另一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,也是上文1.2节所介绍的ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它。

决策树构造方法其实就是每次选择一个好的特征以及分裂点作为当前节点的分类条件。

既然说C4.5算法是ID3的改进算法,那么C4.5相比于ID3改进的地方有哪些呢?:

1. 用信息增益率来选择属性。ID3选择属性用的是子树的信息增益,这里可以用很多

方法来定义信息,ID3使用的是熵(entropy,熵是一种不纯度度量准则),也就是熵的变化值,而C4.5用的是信息增益率。对,区别就在于一个是信息增益,一个是信息增益率。

2. 在树构造过程中进行剪枝,在构造决策树的时候,那些挂着几个元素的节点,不考

虑最好,不然容易导致overfitting。

3. 对非离散数据也能处理。

4. 能够对不完整数据进行处理

针对上述第一点,解释下:一般来说率就是用来取平衡用的,就像方差起的作用差不多,比如有两个跑步的人,一个起点是10m/s的人、其10s后为20m/s;另一个人起速是1m/s、其1s后为2m/s。如果紧紧算差值那么两个差距就很大了,如果使用速度增加率(加速度,即都是为1m/s^2)来衡量,2个人就是一样的加速度。因此,C4.5克服了ID3用信息增益选择属性时偏向选择取值多的属性的不足。

C4.5算法之信息增益率

OK,既然上文中提到C4.5用的是信息增益率,那增益率的具体是如何定义的呢?:

是的,在这里,C4.5算法不再是通过信息增益来选择决策属性。一个可以选择的度量标准是增益比率gain ratio(Quinlan 1986)。增益比率度量是用前面的增益度量Gain(S,A)

和分裂信息度量SplitInformation(S,A)来共同定义的,如下所示:

其中,分裂信息度量被定义为(分裂信息用来衡量属性分裂数据的广度和均匀):

其中S1到Sc是c个值的属性A分割S而形成的c个样例子集。注意分裂信息实际上就是S关于属性A的各值的熵。这与我们前面对熵的使用不同,在那里我们只考虑S关于学习到的树要预测的目标属性的值的熵。

请注意,分裂信息项阻碍选择值为均匀分布的属性。例如,考虑一个含有n个样例的集合被属性A彻底分割(译注:分成n组,即一个样例一组)。这时分裂信息的值为log2n。相反,一个布尔属性B分割同样的n个实例,如果恰好平分两半,那么分裂信息是1。如果属性A和B产生同样的信息增益,那么根据增益比率度量,明显B会得分更高。

使用增益比率代替增益来选择属性产生的一个实际问题是,当某个Si接近S(|Si|?|S|)时分母可能为0或非常小。如果某个属性对于S的所有样例有几乎同样的值,这时要么导致增益比率未定义,要么是增益比率非常大。为了避免选择这种属性,我们可以采用这样一些启发式规则,比如先计算每个属性的增益,然后仅对那些增益高过平均值的属性应用增益比率测试(Quinlan 1986)。

除了信息增益,Lopez de Mantaras(1991)介绍了另一种直接针对上述问题而设计的度量,它是基于距离的(distance-based)。这个度量标准基于所定义的一个数据划分间的距离尺度。具体更多请参看:Tom M.Mitchhell所著的机器学习之3.7.3节。

1.3.2、C4.5算法构造决策树的过程

1.Function C4.5(R:包含连续属性的无类别属性集合,C:类别属性,S:训练集)

2./*返回一棵决策树*/

3.Begin

4. If S为空,返回一个值为Failure的单个节点;

5. If S是由相同类别属性值的记录组成,

6.返回一个带有该值的单个节点;

7. If R为空,则返回一个单节点,其值为在S的记录中找出的频率最高的类别属性值;

8. [注意未出现错误则意味着是不适合分类的记录];

9. For 所有的属性R(Ri) Do

10. If 属性Ri为连续属性,则

11. Begin

12.将Ri的最小值赋给A1:

13.将Rm的最大值赋给Am;/*m值手工设置*/

14. For j From 2 To m-1 Do Aj=A1+j*(A1Am)/m;

15.将Ri点的基于{< =Aj,>Aj}的最大信息增益属性(Ri,S)赋给A;

16. End;

17.将R中属性之间具有最大信息增益的属性(D,S)赋给D;

18.将属性D的值赋给{dj/j=1,2...m};

19.将分别由对应于D的值为dj的记录组成的S的子集赋给{sj/j=1,2...m};

20.返回一棵树,其根标记为D;树枝标记为d1,d2...dm;

21.再分别构造以下树:

22. C4.5(R-{D},C,S1),C4.5(R-{D},C,S2)...C4.5(R-{D},C,Sm);

23.End C4.5

1.3.3、C4.5算法实现中的几个关键步骤

在上文中,我们已经知道了决策树学习C4.5算法中4个重要概念的表达,如下:

1.

2.

3.

4.

接下来,咱们写下代码实现,

1、信息熵

1.double C4_5::entropy(int *attrClassCount, int classNum, int allNum){

2.double iEntropy = 0.0;

3.for(int i = 0; i < classNum; i++){

4.double temp = ((double)attrClassCount[i]) / allNum;

5.if(temp != 0.0)

6. iEntropy -= temp * (log(temp) / log(2.0));

7. }

8.return iEntropy;

9.}

2、信息增益率

1.double C4_5::gainRatio(int classNum, vector attriCount, double pEntropy){

2.int* attriNum = new int[attriCount.size()];

3.int allNum = 0;

4.

5.for(int i = 0; i < (int)attriCount.size(); i++){

6. attriNum[i] = 0;

7.for(int j = 0; j < classNum; j++){

8. attriNum[i] += attriCount[i][j];

9. allNum += attriCount[i][j];

10. }

11. }

12.double gain = 0.0;

13.double splitInfo = 0.0;

14.for(int i = 0; i < (int)attriCount.size(); i++){

15. gain -= ((double)attriNum[i]) / allNum * entropy(attriCount[i], classNum, a

ttriNum[i]);

16. splitInfo -= ((double)attriNum[i]) / allNum * (log(((double)attriNum[i])/al

lNum) / log(2.0));

17. }

18. gain += pEntropy;

19.delete[] attriNum;

20.return (gain / splitInfo);

21.}

3、选取最大增益属性作为分类条件

1.int C4_5::chooseAttribute(vector attrIndex, vector* sampleCount){

2.int bestIndex = 0;

3.double maxGainRatio = 0.0;

4.int classNum = (int)(decisions[attrIndex[(int)attrIndex.size()-1]]).size();//nu

mber of class

5.

6.//computer the class entropy

7.int* temp = new int[classNum];

8.int allNum = 0;

9.for(int i = 0; i < classNum; i++){

10. temp[i] = sampleCount[(int)attrIndex.size()-1][i][i];

11. allNum += temp[i];

12. }

13.double pEntropy = entropy(temp, classNum, allNum);

14.delete[] temp;

15.

16.//computer gain ratio for every attribute

17.for(int i = 0; i < (int)attrIndex.size()-1; i++){

18.double gainR = gainRatio(classNum, sampleCount[i], pEntropy);

19.if(gainR > maxGainRatio){

20. bestIndex = i;

21. maxGainRatio = gainR;

22. }

23. }

24.return bestIndex;

25.}

4、还有一系列建树,打印树的步骤,此处略过。

1.4、决策树归纳的特点

略过....

第二部分、贝叶斯分类

说实话,友人刘未鹏有一篇讲的贝叶斯的文章:数学之美番外篇:平凡而又神奇的贝叶斯方法,已经把贝叶斯讲的很清晰透彻了,我再讲也是如李白看到崔颢在黄鹤楼上所提的:登黄鹤楼

昔人已乘黄鹤去,此地空余黄鹤楼;

黄鹤一去不复返,白云千载空悠悠。

后便大为折服,已无什兴致再提了(偶现在就是这感觉),然文章还得继续写。So,本文第二部分之大部分基本整理自未鹏兄之手,若有任何不妥之处,还望读者和未鹏兄海涵,谢谢。

2.1、什么是贝叶斯分类

贝叶斯定理:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。这里先解释什么是条件概率:

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

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

下面不加证明地直接给出贝叶斯定理(公式被网友指出有问题,待后续验证改正):

2.2 贝叶斯公式如何而来

贝叶斯公式是怎么来的?下面是wikipedia 上的一个例子:

一所学校里面有60% 的男生,40% 的女生。男生总是穿长裤,女生则一半穿长裤一半穿裙子。有了这些信息之后我们可以容易地计算“随机选取一个学生,他(她)穿长裤的概率和穿裙子的概率是多大”,这个就是前面说的“正向概率”的计算。然而,假设你走在校园中,

迎面走来一个穿长裤的学生(很不幸的是你高度近似,你只看得见他(她)穿的是否长裤,而无法确定他(她)的性别),你能够推断出他(她)是男生的概率是多大吗?

一些认知科学的研究表明(《决策与判断》以及《Rationality for Mortals》第12章:小孩也可以解决贝叶斯问题),我们对形式化的贝叶斯问题不擅长,但对于以频率形式呈现的等价问题却很擅长。在这里,我们不妨把问题重新叙述成:你在校园里面随机游走,遇到了N 个穿长裤的人(仍然假设你无法直接观察到他们的性别),问这N 个人里面有多少个女生多少个男生。

你说,这还不简单:算出学校里面有多少穿长裤的,然后在这些人里面再算出有多少女生,不就行了?

我们来算一算:假设学校里面人的总数是U 个。60% 的男生都穿长裤,于是我们得到了U * P(Boy) * P(Pants|Boy) 个穿长裤的(男生)(其中P(Boy) 是男生的概率= 60%,这里可以简单的理解为男生的比例;P(Pants|Boy) 是条件概率,即在Boy 这个条件下穿长裤的概率是多大,这里是100% ,因为所有男生都穿长裤)。40% 的女生里面又有一半(50%)是穿长裤的,于是我们又得到了U * P(Girl) * P(Pants|Girl) 个穿长裤的(女生)。加起来一共是U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl) 个穿长裤的,其中有U * P(Girl) * P(Pants|Girl) 个女生。两者一比就是你要求的答案。

下面我们把这个答案形式化一下:我们要求的是P(Girl|Pants) (穿长裤的人里面有多少女生),我们计算的结果是U * P(Girl) * P(Pants|Girl) / [U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl)] 。容易发现这里校园内人的总数是无关的,可以消去。于是得到

P(Girl|Pants) = P(Girl) * P(Pants|Girl) / [P(Boy) * P(Pants|Boy) + P(Girl) *

P(Pants|Girl)]

注意,如果把上式收缩起来,分母其实就是P(Pants) ,分子其实就是P(Pants, Girl) 。而这个比例很自然地就读作:在穿长裤的人(P(Pants) )里面有多少(穿长裤)的女孩(P(Pants, Girl) )。

上式中的Pants 和Boy/Girl 可以指代一切东西,So,其一般形式就是:

P(A|B) = P(A|B) * P(B) / [P(A|B) * P(B) + P(A|~B) * P(~B) ]

收缩起来就是:

P(A|B) = P(AB) / P(B)

其实这个就等于:

P(A|B) * P(B) = P(AB)

更进一步阐述,P(A|B)便是在条件B的情况下,A出现的概率是多大。然看似这么平凡的贝叶斯公式,背后却隐含着非常深刻的原理。

2.3、拼写纠正

经典著作《人工智能:现代方法》的作者之一Peter Norvig 曾经写过一篇介绍如何写一个拼写检查/纠正器的文章,里面用到的就是贝叶斯方法,这里我们不打算复述他写的文章,而是简要地将其核心思想介绍一下。

首先,我们需要询问的是:―问题是什么?‖

问题是我们看到用户输入了一个不在字典中的单词,我们需要去猜测:―这个家伙到底真正想输入的单词是什么呢?‖用刚才我们形式化的语言来叙述就是,我们需要求:

P(我们猜测他想输入的单词| 他实际输入的单词)

这个概率。并找出那个使得这个概率最大的猜测单词。显然,我们的猜测未必是唯一的,就像前面举的那个自然语言的歧义性的例子一样;这里,比如用户输入:thew ,那么他到底是想输入the ,还是想输入thaw ?到底哪个猜测可能性更大呢?幸运的是我们可以用贝叶斯公式来直接出它们各自的概率,我们不妨将我们的多个猜测记为h1 h2 .. (h 代表hypothesis),它们都属于一个有限且离散的猜测空间H (单词总共就那么多而已),将用户实际输入的单词记为D ( D 代表Data ,即观测数据),于是

P(我们的猜测1 | 他实际输入的单词)

可以抽象地记为:

P(h1 | D)

类似地,对于我们的猜测2,则是P(h2 | D)。不妨统一记为:

P(h | D)

运用一次贝叶斯公式,我们得到:

P(h | D) = P(h) * P(D | h) / P(D)

对于不同的具体猜测h1 h2 h3 .. ,P(D) 都是一样的,所以在比较P(h1 | D) 和P(h2 | D) 的时候我们可以忽略这个常数。即我们只需要知道:

P(h | D) ∝P(h) * P(D | h) (注:那个符号的意思是―正比例于‖,不是无穷大,注意符号右端是有一个小缺口的。)

这个式子的抽象含义是:对于给定观测数据,一个猜测是好是坏,取决于―这个猜测本身独立的可能性大小(先验概率,Prior )‖和―这个猜测生成我们观测到的数据的可能性大小‖(似然,Likelihood )的乘积。具体到我们的那个thew 例子上,含义就是,用户实际是想输入the 的可能性大小取决于the 本身在词汇表中被使用的可能性(频繁程度)大小(先验概率)和想打the 却打成thew 的可能性大小(似然)的乘积。

剩下的事情就很简单了,对于我们猜测为可能的每个单词计算一下P(h) * P(D | h) 这个值,然后取最大的,得到的就是最靠谱的猜测。更多细节请参看未鹏兄之原文。

2.4、贝叶斯的应用

2.4.1、中文分词

贝叶斯是机器学习的核心方法之一。比如中文分词领域就用到了贝叶斯。浪潮之巅的作者吴军在《数学之美》系列中就有一篇是介绍中文分词的。这里介绍一下核心的思想,不做赘述,详细请参考吴军的原文。

分词问题的描述为:给定一个句子(字串),如:

南京市长江大桥

如何对这个句子进行分词(词串)才是最靠谱的。例如:

1. 南京市/长江大桥

2. 南京/市长/江大桥

这两个分词,到底哪个更靠谱呢?

我们用贝叶斯公式来形式化地描述这个问题,令X 为字串(句子),Y 为词串(一种特定的分词假设)。我们就是需要寻找使得P(Y|X) 最大的Y ,使用一次贝叶斯可得:

P(Y|X) ∝P(Y)*P(X|Y)

用自然语言来说就是这种分词方式(词串)的可能性乘以这个词串生成我们的句子的可能性。我们进一步容易看到:可以近似地将P(X|Y) 看作是恒等于1 的,因为任意假想的一种分词方式之下生成我们的句子总是精准地生成的(只需把分词之间的分界符号扔掉

朴素贝叶斯分类算法及其MapReduce实现

最近发现很多公司招聘数据挖掘的职位都提到贝叶斯分类,其实我不太清楚他们是要求理解贝叶斯分类算法,还是要求只需要通过工具(SPSS,SAS,Mahout)使用贝叶斯分类算法进行分类。 反正不管是需求什么都最好是了解其原理,才能知其然,还知其所以然。我尽量简单的描述贝叶斯定义和分类算法,复杂而有全面的描述参考“数据挖掘:概念与技术”。贝叶斯是一个人,叫(Thomas Bayes),下面这哥们就是。 本文介绍了贝叶斯定理,朴素贝叶斯分类算法及其使用MapReduce实现。 贝叶斯定理 首先了解下贝叶斯定理 P X H P(H) P H X= 是不是有感觉都是符号看起来真复杂,我们根据下图理解贝叶斯定理。 这里D是所有顾客(全集),H是购买H商品的顾客,X是购买X商品的顾客。自然X∩H是即购买X又购买H的顾客。 P(X) 指先验概率,指所有顾客中购买X的概率。同理P(H)指的是所有顾客中购买H 的概率,见下式。

X P X= H P H= P(H|X) 指后验概率,在购买X商品的顾客,购买H的概率。同理P(X|H)指的是购买H商品的顾客购买X的概率,见下式。 X∩H P H|X= X∩H P X|H= 将这些公式带入上面贝叶斯定理自然就成立了。 朴素贝叶斯分类 分类算法有很多,基本上决策树,贝叶斯分类和神经网络是齐名的。朴素贝叶斯分类假定一个属性值对给定分类的影响独立于其他属性值。 描述: 这里有个例子假定我们有一个顾客X(age = middle,income=high,sex =man):?年龄(age)取值可以是:小(young),中(middle),大(old) ?收入(income)取值可以是:低(low),中(average),高(high) ?性别(sex)取值可以是:男(man),女(woman) 其选择电脑颜色的分类标号H:白色(white),蓝色(blue),粉色(pink) 问题: 用朴素贝叶斯分类法预测顾客X,选择哪个颜色的分类标号,也就是预测X属于具有最高后验概率的分类。 解答: Step 1 也就是说我们要分别计算X选择分类标号为白色(white),蓝色(blue),粉色(pink)的后验概率,然后进行比较取其中最大值。 根据贝叶斯定理

大数据挖掘(8):朴素贝叶斯分类算法原理与实践

数据挖掘(8):朴素贝叶斯分类算法原理与实践 隔了很久没有写数据挖掘系列的文章了,今天介绍一下朴素贝叶斯分类算法,讲一下基本原理,再以文本分类实践。 一个简单的例子 朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下: 这个公式虽然看上去简单,但它却能总结历史,预知未来。公式的右边是总结历史,公式的左边是预知未来,如果把Y看出类别,X看出特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来。举个例子,大学的时候,某男生经常去图书室晚自习,发现他喜欢的那个女生也常去那个自习室,心中窃喜,于是每天买点好吃点在那个自习室蹲点等她来,可是人家女生不一定每天都来,眼看天气渐渐炎热,图书馆又不开空调,如果那个女生没有去自修室,该男生也就不去,每次男生鼓足勇气说:“嘿,你明天还来不?”,“啊,不知道,看情况”。然后该男生每天就把她去自习室与否以及一些其他情况做一下记录,用Y表示该女生是否去自习室,即Y={去,不去},X是跟去自修室有关联的一系列条件,比如当天上了哪门主课,蹲点统计了一段时间后,该男生打算今天不再蹲点,而是先预测一下她会不会去,现在已经知道了今天上了常微分方法这么主课,于是计算P(Y=去|常微分方

程)与P(Y=不去|常微分方程),看哪个概率大,如果P(Y=去|常微分方程) >P(Y=不去|常微分方程),那这个男生不管多热都屁颠屁颠去自习室了,否则不就去自习室受罪了。P(Y=去|常微分方程)的计算可以转为计算以前她去的情况下,那天主课是常微分的概率P(常微分方程|Y=去),注意公式右边的分母对每个类别(去/不去)都是一样的,所以计算的时候忽略掉分母,这样虽然得到的概率值已经不再是0~1之间,但是其大小还是能选择类别。 后来他发现还有一些其他条件可以挖,比如当天星期几、当天的天气,以及上一次与她在自修室的气氛,统计了一段时间后,该男子一计算,发现不好算了,因为总结历史的公式: 这里n=3,x(1)表示主课,x(2)表示天气,x(3)表示星期几,x(4)表示气氛,Y仍然是{去,不去},现在主课有8门,天气有晴、雨、阴三种、气氛有A+,A,B+,B,C五种,那么总共需要估计的参数有8*3*7*5*2=1680个,每天只能收集到一条数据,那么等凑齐1 680条数据大学都毕业了,男生打呼不妙,于是做了一个独立性假设,假设这些影响她去自习室的原因是独立互不相关的,于是 有了这个独立假设后,需要估计的参数就变为,(8+3+7+5)*2 = 46个了,而且每天收集的一条数据,可以提供4个参数,这样该男生就预测越来越准了。

贝叶斯分类多实例分析总结

用于运动识别的聚类特征融合方法和装置 提供了一种用于运动识别的聚类特征融合方法和装置,所述方法包括:将从被采集者的加速度信号 中提取的时频域特征集的子集内的时频域特征表示成以聚类中心为基向量的线性方程组;通过求解线性方程组来确定每组聚类中心基向量的系数;使用聚类中心基向量的系数计算聚类中心基向量对子集的方差贡献率;基于方差贡献率计算子集的聚类中心的融合权重;以及基于融合权重来获得融合后的时频域特征集。 加速度信号 →时频域特征 →以聚类中心为基向量的线性方程组 →基向量的系数 →方差贡献率 →融合权重 基于特征组合的步态行为识别方法 本发明公开了一种基于特征组合的步态行为识别方法,包括以下步骤:通过加速度传感器获取用户在行为状态下身体的运动加速度信息;从上述运动加速度信息中计算各轴的峰值、频率、步态周期和四分位差及不同轴之间的互相关系数;采用聚合法选取参数组成特征向量;以样本集和步态加速度信号的特征向量作为训练集,对分类器进行训练,使的分类器具有分类步态行为的能力;将待识别的步态加速度信号的所有特征向量输入到训练后的分类器中,并分别赋予所属类别,统计所有特征向量的所属类别,并将出现次数最多的类别赋予待识别的步态加速度信号。实现简化计算过程,降低特征向量的维数并具有良好的有效性的目的。 传感器 →样本及和步态加速度信号的特征向量作为训练集 →分类器具有分类步态行为的能力 基于贝叶斯网络的核心网故障诊断方法及系统 本发明公开了一种基于贝叶斯网络的核心网故障诊断方法及系统,该方法从核心网的故障受理中心采集包含有告警信息和故障类型的原始数据并生成样本数据,之后存储到后备训练数据集中进行积累,达到设定的阈值后放入训练数据集中;运用贝叶斯网络算法对训练数据集中的样本数据进行计算,构造贝叶斯网络分类器;从核心网的网络管理系统采集含有告警信息的原始数据,经贝叶斯网络分类器计算获得告警信息对应的故障类型。本发明,利用贝叶斯网络分类器构建故障诊断系统,实现了对错综复杂的核心网故障进行智能化的系统诊断功能,提高了诊断的准确性和灵活性,并且该系统构建于网络管理系统之上,易于实施,对核心网综合信息处理具有广泛的适应性。 告警信息和故障类型 →训练集 —>贝叶斯网络分类器

贝叶斯分类算法

最近在面试中,除了基础& 算法& 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法,而我向来恨对一个东西只知其皮毛而不得深入,故写一个有关聚类& 分类算法的系列文章以作为自己备试之用(尽管貌似已无多大必要,但还是觉得应该写下以备将来常常回顾思考)。行文杂乱,但侥幸若能对读者也起到一定帮助,则幸甚至哉。 本分类& 聚类算法系列借鉴和参考了两本书,一本是Tom M.Mitchhell所著的机器学习,一本是数据挖掘导论,这两本书皆分别是机器学习& 数据挖掘领域的开山or杠鼎之作,读者有继续深入下去的兴趣的话,不妨在阅读本文之后,课后细细研读这两本书。除此之外,还参考了网上不少牛人的作品(文末已注明参考文献或链接),在此,皆一一表示感谢。 本分类& 聚类算法系列暂称之为Top 10 Algorithms in Data Mining,其中,各篇分别有以下具体内容: 1. 开篇:决策树学习Decision Tree,与贝叶斯分类算法(含隐马可夫模型HMM); 2. 第二篇:支持向量机SVM(support vector machine),与神经网络ANN; 3. 第三篇:待定... 说白了,一年多以前,我在本blog内写过一篇文章,叫做:数据挖掘领域十大经典算法初探(题外话:最初有个出版社的朋友便是因此文找到的我,尽管现在看来,我离出书日期仍是遥遥无期)。现在,我抽取其中几个最值得一写的几个算法每一个都写一遍,以期对其有个大致通透的了解。 OK,全系列任何一篇文章若有任何错误,漏洞,或不妥之处,还请读者们一定要随时不吝赐教& 指正,谢谢各位。 基础储备:分类与聚类 在讲具体的分类和聚类算法之前,有必要讲一下什么是分类,什么是聚类,都包含哪些具体算法或问题。 常见的分类与聚类算法 简单来说,自然语言处理中,我们经常提到的文本分类便就是一个分类问题,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:朴素的贝叶斯分类算法(native Bayesian classifier)、基于支持向量机(SVM)的分类器,k-最近邻法(k-nearest neighbor,

朴素贝叶斯分类器应用

朴素贝叶斯分类器的应用 作者:阮一峰 日期:2013年12月16日 生活中很多场合需要用到分类,比如新闻分类、病人分类等等。 本文介绍朴素贝叶斯分类器(Naive Bayes classifier),它是一种简单有效的常用分类算法。 一、病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难。 某个医院早上收了六个门诊病人,如下表。 症状职业疾病 打喷嚏护士感冒 打喷嚏农夫过敏 头痛建筑工人脑震荡 头痛建筑工人感冒 打喷嚏教师感冒 头痛教师脑震荡 现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大? 根据贝叶斯定理: P(A|B) = P(B|A) P(A) / P(B)

可得 P(感冒|打喷嚏x建筑工人) = P(打喷嚏x建筑工人|感冒) x P(感冒) / P(打喷嚏x建筑工人) 假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了 P(感冒|打喷嚏x建筑工人) = P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒) / P(打喷嚏) x P(建筑工人) 这是可以计算的。 P(感冒|打喷嚏x建筑工人) = 0.66 x 0.33 x 0.5 / 0.5 x 0.33 = 0.66 因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。 这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。 二、朴素贝叶斯分类器的公式 假设某个体有n项特征(Feature),分别为F1、F2、...、F n。现有m个类别(Category),分别为C1、C2、...、C m。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值: P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C) / P(F1F2...Fn) 由于 P(F1F2...Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求 P(F1F2...Fn|C)P(C) 的最大值。

朴素贝叶斯算法详细总结

朴素贝叶斯算法详细总结 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法,是经典的机器学习算法之一,处理很多问题时直接又高效,因此在很多领域有着广泛的应用,如垃圾邮件过滤、文本分类等。也是学习研究自然语言处理问题的一个很好的切入口。朴素贝叶斯原理简单,却有着坚实的数学理论基础,对于刚开始学习算法或者数学基础差的同学们来说,还是会遇到一些困难,花费一定的时间。比如小编刚准备学习的时候,看到贝叶斯公式还是有点小害怕的,也不知道自己能不能搞定。至此,人工智能头条特别为大家寻找并推荐一些文章,希望大家在看过学习后,不仅能消除心里的小恐惧,还能高效、容易理解的get到这个方法,从中获得启发没准还能追到一个女朋友,脱单我们是有技术的。贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到的朴素贝叶斯分类算法,希望有利于他人理解。 ▌分类问题综述 对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱、”之类的话,其实这就是一种分类操作。 既然是贝叶斯分类算法,那么分类的数学描述又是什么呢? 从数学角度来说,分类问题可做如下定义: 已知集合C=y1,y2,……,yn 和I=x1,x2,……,xn确定映射规则y=f(),使得任意xi∈I有且仅有一个yi∈C,使得yi∈f(xi)成立。 其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。 分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。那么如何由指定特征,得到我们最终的类别,也是我们下面要讲的,每一个不同的分类算法,对

Bayes分类器原理

贝叶斯分类器 一、朴素贝叶斯分类器原理 目标: 计算(|)j P C t 。注:t 是一个多维的文本向量 分析: 由于数据t 是一个新的数据,(|)j P C t 无法在训练数据集中统计出来。因此需要转换。根据概率论中的贝叶斯定理 (|)()(|)() P B A P A P A B P B = 将(|)j P C t 的计算转换为: (|)() (|)()j j j P t C P C P C t P t = (1) 其中,()j P C 表示类C j 在整个数据空间中的出现概率,可以在训练集中统计出来(即用C j 在训练数据集中出现的频率()j F C 来作为概率()j P C 。但(|)j P t C 和()P t 仍然不能统计出来。 首先,对于(|)j P t C ,它表示在类j C 中出现数据t 的概率。根据“属性独立性假设”,即对于属于类j C 的所有数据,它们个各属性出现某个值的概率是相互独立的。如,判断一个干部是否是“好干部”(分类)时,其属性“生活作风=好”的概率(P(生活作风=好|好干部))与“工作态度=好”的概率(P(工作态度=好|好干部))是独立的,没有潜在的相互关联。换句话说,一个好干部,其生活作风的好坏与其工作态度的好坏完全无关。我们知道这并不能反映真实的情况,因而说是一种“假设”。使用该假设来分类的方法称为“朴素贝叶斯分类”。 根据上述假设,类j C 中出现数据t 的概率等于其中出现t 中各属性值的概率的乘积。即: (|)(|)j k j k P t C P t C =∏ (2) 其中,k t 是数据t 的第k 个属性值。 其次,对于公式(1)中的()P t ,即数据t 在整个数据空间中出现的概率,等于它在各

贝叶斯分类器工作原理

贝叶斯分类器工作原理原理 贝叶斯分类器是一种比较有潜力的数据挖掘工具,它本质上是一 种分类手段,但是它的优势不仅仅在于高分类准确率,更重要的是,它会通过训练集学习一个因果关系图(有向无环图)。如在医学领域,贝叶斯分类器可以辅助医生判断病情,并给出各症状影响关系,这样医生就可以有重点的分析病情给出更全面的诊断。进一步来说,在面对未知问题的情况下,可以从该因果关系图入手分析,而贝叶斯分类器此时充当的是一种辅助分析问题领域的工具。如果我们能够提出一种准确率很高的分类模型,那么无论是辅助诊疗还是辅助分析的作用都会非常大甚至起主导作用,可见贝叶斯分类器的研究是非常有意义的。 与五花八门的贝叶斯分类器构造方法相比,其工作原理就相对简 单很多。我们甚至可以把它归结为一个如下所示的公式: 其中实例用T{X0,X1,…,Xn-1}表示,类别用C 表示,AXi 表示Xi 的 父节点集合。 选取其中后验概率最大的c ,即分类结果,可用如下公式表示 () ()()() ()( ) 0011111 00011111 0|,, ,|,,, ,C c |,i i n n n i i X i n n n i i X i P C c X x X x X x P C c P X x A C c P X x X x X x P P X x A C c ---=---========= ===∝===∏∏()() 1 0arg max |A ,i n c C i i X i c P C c P X x C c -∈=====∏

上述公式本质上是由两部分构成的:贝叶斯分类模型和贝叶斯公式。下面介绍贝叶斯分类器工作流程: 1.学习训练集,存储计算条件概率所需的属性组合个数。 2.使用1中存储的数据,计算构造模型所需的互信息和条件互信息。 3.使用2种计算的互信息和条件互信息,按照定义的构造规则,逐步构建出贝叶斯分类模型。 4.传入测试实例 5.根据贝叶斯分类模型的结构和贝叶斯公式计算后验概率分布。6.选取其中后验概率最大的类c,即预测结果。 其流程图如下所示:

朴素贝叶斯分类算法代码实现

朴素贝叶斯分类算法 一.贝叶斯分类的原理 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是最小错误率意义上的优化。 贝叶斯分类器是用于分类的贝叶斯网络。该网络中应包含类结点C,其中C 的取值来自于类集合( c1 , c2 , ... , cm),还包含一组结点X = ( X1 , X2 , ... , Xn),表示用于分类的特征。对于贝叶斯网络分类器,若某一待分类的样本D,其分类特征值为x = ( x1 , x2 , ... , x n) ,则样本D 属于类别ci 的概率P( C = ci | X1 = x1 , X2 = x 2 , ... , Xn = x n) ,( i = 1 ,2 , ... , m) 应满足下式: P( C = ci | X = x) = Max{ P( C = c1 | X = x) , P( C = c2 | X = x ) , ... , P( C = cm | X = x ) } 贝叶斯公式: P( C = ci | X = x) = P( X = x | C = ci) * P( C = ci) / P( X = x) 其中,P( C = ci) 可由领域专家的经验得到,而P( X = x | C = ci) 和P( X = x) 的计算则较困难。 二.贝叶斯伪代码 整个算法可以分为两个部分,“建立模型”与“进行预测”,其建立模型的伪代码如下: numAttrValues 等简单的数据从本地数据结构中直接读取 构建几个关键的计数表 for(为每一个实例) { for( 每个属性 ){ 为 numClassAndAttr 中当前类,当前属性,当前取值的单元加 1 为 attFrequencies 中当前取值单元加 1 } } 预测的伪代码如下: for(每一个类别){ for(对每个属性 xj){ for(对每个属性 xi){

算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)

算法杂货铺——分类算法之贝叶斯网络(Bayesian networks) 2010-09-18 22:50 by EricZhang(T2噬菌体), 2561 visits, 网摘, 收藏, 编辑 2.1、摘要 在上一篇文章中我们讨论了朴素贝叶斯分类。朴素贝叶斯分类有一个限制条件,就是特征属性必须有条件独立或基本独立(实际上在现实应用中几乎不可能做到完全独立)。当这个条件成立时,朴素贝叶斯分类法的准确率是最高的,但不幸的是,现实中各个特征属性间往往并不条件独立,而是具有较强的相关性,这样就限制了朴素贝叶斯分类的能力。这一篇文章中,我们接着上一篇文章的例子,讨论贝叶斯分类中更高级、应用范围更广的一种算法——贝叶斯网络(又称贝叶斯信念网络或信念网络)。 2.2、重新考虑上一篇的例子 上一篇文章我们使用朴素贝叶斯分类实现了SNS社区中不真实账号的检测。在那个解决方案中,我做了如下假设: i、真实账号比非真实账号平均具有更大的日志密度、各大的好友密度以及更多的使用真实头像。 ii、日志密度、好友密度和是否使用真实头像在账号真实性给定的条件下是独立的。 但是,上述第二条假设很可能并不成立。一般来说,好友密度除了与账号是否真实有关,还与是否有真实头像有关,因为真实的头像会吸引更多人加其为好友。因此,我们为了获取更准确的分类,可以将假设修改如下: i、真实账号比非真实账号平均具有更大的日志密度、各大的好友密度以及更多的使用真实头像。 ii、日志密度与好友密度、日志密度与是否使用真实头像在账号真实性给定的条件下是独立的。 iii、使用真实头像的用户比使用非真实头像的用户平均有更大的好友密度。

基于朴素贝叶斯的文本分类算法

基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用。本文详细介绍了朴素贝叶斯的基本原理,讨论了两种常见模型:多项式模型(MM)和伯努利模型(BM),实现了可运行的代码,并进行了一些数据测试。 关键字:朴素贝叶斯;文本分类 Text Classification Algorithm Based on Naive Bayes Author: soulmachine Email:soulmachine@https://www.360docs.net/doc/6310445899.html, Blog:https://www.360docs.net/doc/6310445899.html, Abstract:Usually there are three methods for text classification: SVM、KNN and Na?ve Bayes. Na?ve Bayes is easy to implement and fast, so it is widely used. This article introduced the theory of Na?ve Bayes and discussed two popular models: multinomial model(MM) and Bernoulli model(BM) in details, implemented runnable code and performed some data tests. Keywords: na?ve bayes; text classification 第1章贝叶斯原理 1.1 贝叶斯公式 设A、B是两个事件,且P(A)>0,称 为在事件A发生的条件下事件B发生的条件概率。 乘法公式P(XYZ)=P(Z|XY)P(Y|X)P(X) 全概率公式P(X)=P(X|Y 1)+ P(X|Y 2 )+…+ P(X|Y n ) 贝叶斯公式 在此处,贝叶斯公式,我们要用到的是

贝叶斯分类

贝叶斯分类 1、定义:依据贝叶斯准则(两组间最大分离原则)建立的判别函数集进行的图像 分类。 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。 2、贝叶斯定理: (|)() (|) () P A B P B p B A P A 说明:(|) p A B表示事件B发生的前提下,事件A发生的概率;() p A表示事件A发生的概率;() p B事件B发生的概率。则可以求得事件A发生的前提下,事件B 发生的概率。贝叶斯定理给出了最小化误差的最优解决方法,可用于分类和预测。 将前面贝叶斯公式变化如下: 上述公式中,C代表类别,X代表特征,很明显,我们做出预测肯定是利用当前的特征,来判断输出的类别。当然这里也可以很明显的看到贝叶斯公式先验与后验概率之间的转换,很明显,P(c|x)在我们的定义里面是后验概率,也是我们想要得到的东西。而P(x)、P(c) 以及P(x|c)都是先验概率,它们分别X特征出现的概率,C类出现的概率,C类中,出现X的概率。而第一项对于多类分类来说,都是一样,都是当前观察到的特征,所以此项可以略去。那最终的结果就是计算P(x|c)*P(c)这一项,P(c)是可以通过观察来解决的。重点也就全部落在了P(x|c)上,上面对于此项的解释是在C类中,X特征出现的概率,其实简单来讲,就是X的概率密度。 3、特点 1)。贝叶斯分类并不是把一个对象绝对地指派给某一类,而是通过计算得出属于某一类的概率。具有最大概率的类便是该对象所属的类。2)。一般情况下在贝叶斯分类中所有的属性都潜在的起作用,即并不是一个或几个属性决定分类,而是所有的属性都参与分类。3)贝叶斯分类的属性可以是离散的、连续的、也可以是混合的。 4、分类:(1) 朴素贝叶斯算法。(2) TAN算法 1)朴素贝叶斯算法成立的前提是各属性之间互相独立。当数据集满足这种独立性假设时,分类的准确度较高,否则可能较低。另外,该算法没有分类规则输出。 设每个数据样本用一个n维特征向量来描述n个属性的值,即:X={x1,x2,…,xn},假定有m个类,分别用C1, C2,…,Cm表示。给定一个未知的数据样本X(即没有类标号),若朴素贝叶斯分类法将未知的样本X分配给类Ci,则一定是

朴素贝叶斯分类matlab实现

实验二 朴素贝叶斯分类 一、实验目的 通过实验,加深对统计判决与概率密度估计基本思想、方法的认识,了解影响Bayes 分类器性能的因素,掌握基于Bayes 决策理论的随机模式分类的原理和方法。 二、实验内容 设计Bayes 决策理论的随机模式分类器,用matlab 实现。 三、方法手段 Bayes 分类器的基本思想是依据类的概率、概密,按照某种准则使分类结果从统计上讲是最佳的。换言之,根据类的概率、概密将模式空间划分成若干个子空间,在此基础上形成模式分类的判决规则。准则函数不同,所导出的判决规则就不同,分类结果也不同。使用哪种准则或方法应根据具体问题来确定。 四、Bayes 算法 朴素贝叶斯分类或简单贝叶斯分类的工作过程如下: (1)每个数据样本用一个n 维特征向量{}12,,...n X x x x =表示,分别描述对n 个属性A 1,A 2,…A n 样本的n 个度量。 (2)假定有m 个类C 1,C 2,…C m 。给定一个未知的数据样本X (即没有类标号),分类法将预测X 属于具有最高后验概率(条件X 下)的类。即是说,朴素贝叶斯分类将未知的样本分配给类C i ,当且仅当 》 ()(),1,i j P C X P C X j m j i >≤≤≠ () 这样,最大化()i P C X 。其()i P C X 最大的类C i 称为最大后验假定。根据贝叶斯定理 ()()()P X H P H P H X P X = , ()()() () i i i P X C P C P C X P X = () (3)由于P(X)对于所有类为常数,只需要()()i i P X C P C 最大即可。如果类的先验概率未知,则通常假定这些类是等概率的,即P(C 1)=P(C 2)=…=P(C m )。并据此只对()i P X 最大化。否则,最大化()()i i P X C P C 。注意,类的先验概率可以用()i i P C s s =计算其中 s i 是类C i 中的训练样本数,而s 是训练样本总数。 (4)给定具有许多属性的数据集,计算()i P X 的开销可能非常大。为降低计算 ()i P X 的开销,可以做类条件独立的朴素假定。给定样本的类标号,假定属性值相互条件

基于朴素贝叶斯的分类算法

数据挖掘实验报告 一、数据集分析 本实验所使用的数据集名称为Abalone data,该数据集问题是一个分类的问题,需要我们做的是预测鲍鱼的年龄以及预测的准确率,由数据集可知,这个年龄是由“性别”,“长度”,“半径”,“重量”等八个属性所共同决定。 因为本次试验所使用的算法为朴素贝叶斯分类算法,所以属性一共是八个,但是年龄类别有29类,如果分为29类预测,正确率很低。这里我将29类归一化到了8类。二、朴素贝叶斯算法分析 2.1 摘要 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。本文作为分类算法的第一篇,将首先介绍分类问题,对分类问题进行一个正式的定义。然后,介绍贝叶斯分类算法的基础——贝叶斯定理。最后,通过实例讨论贝叶斯分类中最简单的一种:朴素贝叶斯分类。 2.2 贝叶斯分类的基础——贝叶斯定理 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事 件A的条件概率。其基本求解公式为:。 贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。 下面不加证明地直接给出贝叶斯定理: 2.3 朴素贝叶斯分类 朴素贝叶斯分类的正式定义如下: 1、设为一个待分类项,而每个a为x的一个特征属性。

2、有类别集合。 3、计算。 4、如果,则。 那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做: 1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。 2、统计得到在各类别下各个特征属性的条件概率估计。即 。 3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导: 因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有: 根据上述分析,朴素贝叶斯分类的流程可以由下图表示

贝叶斯分类算法

贝叶斯分类算法

matlab源程序: A1=[2 4 3 2 4 3 3 6 6 3;3 0 2 2 2 1 4 1 2 3]; B1=[9;5]; C1=[A1,B1] %类别为C j及在C j条件下A i取a i的样例数 A2=[A1(1,:)./B1(1);A1(2,:)./B1(2)]; B2=[B1(1)/sum(B1);B1(2)/sum(B1)] C2=[A2,B2] %先验概率P(C j) 和条件概率P(a i|C j) disp('样本x={Sunny,Hot,High,Weak}') P1=C2(1,1)*C2(1,4)*C2(1,7)*C2(1,9)*C2(1,11); %等于Yes的概率P(Yes|x) P2=C2(2,1)*C2(2,4)*C2(2,7)*C2(2,9)*C2(2,11); %等于No的概率P(No|x) disp('等于yes的概率P(Yes|x)=') disp(P1) disp('等于No的概率P(No|x)=') disp(P2) max(P1,P2); %选择其中概率最大的类别作为x的类别if P1>=P2 disp('x分类为Yes') else disp('x分类为No') end 运行结果: C1 = 2 4 3 2 4 3 3 6 6 3 9 3 0 2 2 2 1 4 1 2 3 5 B2 = 0.6429 0.3571

C2 = Columns 1 through 8 0.2222 0.4444 0.3333 0.2222 0.4444 0.3333 0.3333 0.6667 0.6000 0 0.4000 0.4000 0.4000 0.2000 0.8000 0.2000 Columns 9 through 11 0.6667 0.3333 0.6429 0.4000 0.6000 0.3571 样本x={Sunny,Hot,High,Weak} 等于yes的概率P(Yes|x)= 0.0071 等于no的概率P(No|x)= 0.0274 x分类为No

朴素贝叶斯分类

朴素贝叶斯分类 1.1、摘要 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。本文作为分类算法的第一篇,将首先介绍分类问题,对分类问题进行一个正式的定义。然后,介绍贝叶斯分类算法的基础——贝叶斯定理。最后,通过实例讨论贝叶斯分类中最简单的一种:朴素贝叶斯分类。 1.2、分类问题综述 对于分类问题,其实谁都不会陌生,说我们每个人每天都在执行分类操作一点都不夸张,只是我们没有意识到罢了。例如,当你看到一个陌生人,你的脑子下意识判断TA是男是女;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱、那边有个非主流”之类的话,其实这就是一种分类操作。 从数学角度来说,分类问题可做如下定义: 已知集合:和,确定映射规则 ,使得任意有且仅有一个使得成立。(不考虑模糊数学里的模糊集情况) 其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合,其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。 这里要着重强调,分类问题往往采用经验性方法构造映射规则,即一般情况下的分类问题缺少足够的信息来构造100%正确的映射规则,而是通过对经验数据的学习从而实现一定概率意义上正确的分类,因此所训练出的分类器并不是一定能将每个待分类项准确映射到其分类,分类器的质量与分类器构造方法、待分类数据的特性以及训练样本数量等诸多因素有关。 例如,医生对病人进行诊断就是一个典型的分类过程,任何一个医生都无法直接看到病人的病情,只能观察病人表现出的症状和各种化验检测数据来推断病情,这时医生就好比一个分类器,而这个医生诊断的准确率,与他当初受到的教育方式(构造方法)、病人的症状是否突出(待分类数据的特性)以及医生的经验多少(训练样本数量)都有密切关系。1.3、贝叶斯分类的基础——贝叶斯定理 每次提到贝叶斯定理,我心中的崇敬之情都油然而生,倒不是因为这个定理多高深,而是因为它特别有用。这个定理解决了现实生活里经常遇到的问题:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。这里先解释什么是条件概率:

简单朴素贝叶斯分类器的思想与算法分析

简单朴素贝叶斯分类器的思想与算法分析 在数据仓库和数据挖掘应用中,分类是一种非常重要的方法.分类的概念是在已有数据的基础上学会一个分类函数或构造出一个分类模型,即我们通常所说的分类器(Classifier).该函数或模型能够把数据集合中的数据记录映射到给定类别中的某一个值,从而可以应用于数据预测.目前,分类的主要算法有贝叶斯算法、决策树算法(如ID3、C4.5等)、规则推导、人工神经网络、最近邻算法、支持向量机等等.这些算法在许多现实数据集合上具有较好的预测精度.其中朴素贝叶斯算法具有良好的可解释性等,在实践中的应用最为广泛. 朴素贝叶斯算法是基于统计理论的方法,它能够预测所属类别的概率.简单朴素贝叶斯分类器假设一个指定类别中各属性的取值是相互独立的.这一假设称为给定类别条件下的独立性(Class Conditional Independence)假设,它可以有效减少在构造分类器时所需要的计算量. 简单朴素贝叶斯算法的分类模型是基于Bayes 定理的,下面就简单介绍一下Bayes 定理.设X 为一个类别未知的数据样本,H 为某个假设,C 表示类别集合,若数据样本X 属于一个特定的类别c ,那么分类问题就是决定P (H /X ),即在获得数据样本X 时,H 假设成立的概率.由于P (H ) , P (X ), P (X /H )的概率值可以从(供学习使用的)数据集合中得到,Bayes 定理描述了如何根据P (H ) , P (X ), P (X /H )计算获得的P (H /X ),有关的具体公式定义描述如下: (/)() (/)() P X H P H P H X P X = (1) 简单朴素贝叶斯分类器进行分类操作的步骤说明如下: 1. 每个数据样本均是由一个n 维特征向量X ={x 1,x 2, ……, x n }来描述其n 个属性(A 1, A 2, ……, A n )的具体取值. 2. 假设共有m 个不同类别,{C 1, C 2, ……, C n }.给定一个未知类别的数据样本X ,分类器在已知样本X 的情况下,预测X 属于事后概率最大的那个类别.也就是说,朴素贝叶斯分类器将未知类别的样本X 归属到类别C i ,当且仅当:P (C i /X )> P (C j /X ) 其中1≤j ≤m ,j ≠i . 也就是P (C i /X )最大.其中的类别C i 就称为最大事后概率的假设,根据Bayes 定理可知, (/)() (/)() i i i P X C P C P C X P X = (2) 3. 由于P (X )对于所有的类别均是相同的,所以,要使公式(2)取得最大值,只需要P (X /C i )P (C i )取最大即可.类别的事前概率P (C i )可以通过公式P (C i )=s i /s 进行估算,其中s i 为训练样本集合类别C i 的个数,s 为整个训练样本集合的大小.

朴素贝叶斯算法C 代码有截图

#include #include #include #include //_getcwd(), _chdir() #include //_MAX_PATH, system() #include //_finddata_t, _findfirst(), _findnext(), _findclose() char vocabulary[1000][20];/*声明公有二维数组,用来存储分割好的单词*/ /*=================将要分类的文本分割成单词存储在二维数组vocabulary中================*/ //@输入参数:要分类的文本 //@输出参数:该文本中总单词数 int SplitToWord(char text[]) { int i=0; char seps[]=", .\n"; /*定义单词的分隔符*/ char *substring; /******利用分隔符将文本内容分割成单词并存储******/ substring=strtok(text,seps); while(substring!=NULL) { strcpy(vocabulary[i],substring);//将单词存储到vocabulary数组中 substring=strtok(NULL,seps); i++; } return i; //返回一共多少个单词 } /*===============================计算该目录下的文件数================================*/ //@输入参数:无 //@输出参数:该目录下.txt文件数 int CountDirectory() { int count=0; //txt文件计数器 long hFile; _finddata_t fileinfo;

基于朴素贝叶斯分类器的文本分类算法

基于朴素贝叶斯分类器的文本分类算法(上) 2010-02-21 10:23:43| 分类:Lucene | 标签:|字号大中小订阅 转载请保留作者信息: 作者:phinecos(洞庭散人) Blog:https://www.360docs.net/doc/6310445899.html,/ Email:phinecos@https://www.360docs.net/doc/6310445899.html, Preface 本文缘起于最近在读的一本书-- Tom M.Mitchell的《机器学习》,书中第6章详细讲解了贝叶斯学习的理论知识,为了将其应用到实际中来,参考了网上许多资料,从而得此文。文章将分为两个部分,第一部分将介绍贝叶斯学习的相关理论(如果你对理论不感兴趣,请直接跳至第二部分<<基于朴素贝叶斯分类器的文本分类算法(下)>>)。第二部分讲如何将贝叶斯分类器应用到中文文本分类,随文附上示例代码。 Introduction 我们在《概率论和数理统计》这门课的第一章都学过贝叶斯公式和全概率公式,先来简单复习下: 条件概率 定义设A, B是两个事件,且P(A)>0 称P(B∣A)=P(AB)/P(A)为在条件A下发生的条件事件B发生的条件概率。 乘法公式设P(A)>0 则有P(AB)=P(B∣A)P(A) 全概率公式和贝叶斯公式 定义设S为试验E的样本空间,B1, B2, …Bn为E的一组事件,若BiBj=Ф, i≠j, i, j=1, 2, …,n; B1∪B2∪…∪Bn=S则称B1, B2, …, Bn为样本空间的一个划分。 定理设试验E的样本空间为,A为E的事件,B1, B2, …,Bn为的一个划分,且P(Bi)>0 (i=1, 2, …n),则P(A)=P(A∣B1)P(B1)+P(A∣B2)+ …+P(A∣Bn)P(Bn)称为全概率公式。 定理设试验俄E的样本空间为S,A为E的事件,B1, B2, …,Bn为的一个划分,则 P(Bi∣A)=P(A∣Bi)P(Bi)/∑P(A|Bj)P(Bj)=P(B|Ai)P(Ai)/P(A) 称为贝叶斯公式。说明:i,j均为下标,求和均是1到n 下面我再举个简单的例子来说明下。 示例1 考虑一个医疗诊断问题,有两种可能的假设:(1)病人有癌症。(2)病人无癌症。样本数据来自某化验测试,它也有两种可能的结果:阳性和阴性。假设我们已经有先验知识:在所有人口中只有0.008的人患病。此外,化验测试对有病的患者有98%的可能返回阳性结果,对无病患者有97%的可能返回阴性结果。 上面的数据可以用以下概率式子表示:

相关文档
最新文档