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

 

转载请保留作者信息:

作者:phinecos(洞庭散人)

Bloghttp://phinecos.cnblogs.com/

Emailphinecos@163.com

 Preface

       本文缘起于最近在读的一本书-- Tom M.Mitchell《机器学习》,书中第6章详细讲解了贝叶斯学习的理论知识,为了将其应用到实际中来,参考了网上许多资料,从而得此文。文章将分为两个部分,第一部分将介绍贝叶斯学习的相关理论(如果你对理论不感兴趣,请直接跳至第二部分<<基于朴素贝叶斯分类器的文本分类算法(下)>>)。第二部分讲如何将贝叶斯分类器应用到中文文本分类,随文附上示例代码。

 Introduction

我们在《概率论和数理统计》这门课的第一章都学过贝叶斯公式和全概率公式,先来简单复习下:

条件概率

定义 A, B是两个事件,且P(A)>0 P(BA)=P(AB)/P(A)为在条件A下发生的条件事件B发生的条件概率。

乘法公式 P(A)>0 则有P(AB)=P(BA)P(A)

全概率公式和贝叶斯公式

定义 S为试验E的样本空间,B1, B2, …BnE的一组事件,若BiBj=Ф, i≠j, i, j=1, 2, …,n; B1B2Bn=S则称B1, B2, …, Bn为样本空间的一个划分。

定理 设试验E的样本空间为,AE的事件,B1, B2, …,Bn为的一个划分,且P(Bi)>0 (i=1, 2, …n),则P(A)=P(AB1)P(B1)+P(AB2)+ …+P(ABn)P(Bn)称为全概率公式。

定理 设试验俄E的样本空间为SAE的事件,B1, B2, …,Bn为的一个划分,则

P(BiA)=P(ABi)P(Bi)/∑P(BAj)P(Aj)=P(BAi)P(Ai)/P(B)

称为贝叶斯公式。说明:ij均为下标,求和均是1n  

 下面我再举个简单的例子来说明下。

示例1

考虑一个医疗诊断问题,有两种可能的假设:(1)病人有癌症。(2)病人无癌症。样本数据来自某化验测试,它也有两种可能的结果:阳性和阴性。假设我们已经有先验知识:在所有人口中只有0.008的人患病。此外,化验测试对有病的患者有98%的可能返回阳性结果,对无病患者有97%的可能返回阴性结果。

上面的数据可以用以下概率式子表示:

P(cancer)=0.008,P(cancer)=0.992

P(阳性|cancer)=0.98,P(阴性|cancer)=0.02

P(阳性|cancer)=0.03P(阴性|cancer)=0.97

假设现在有一个新病人,化验测试返回阳性,是否将病人断定为有癌症呢?我们可以来计算极大后验假设:

P(阳性|cancer)p(cancer)=0.98*0.008 = 0.0078

P(阳性|cancer)*p(cancer)=0.03*0.992 = 0.0298

因此,应该判断为无癌症。

 贝叶斯学习理论

       贝叶斯是一种基于概率的学习算法,能够用来计算显式的假设概率,它基于假设的先验概率,给定假设下观察到不同数据的概率以及观察到的数据本身(后面我们可以看到,其实就这么三点东西,呵呵)。

      我们用P(h)表示没有训练样本数据前假设h拥有的初始概率,也就称为h的先验概率,它反映了我们所拥有的关于h是一个正确假设的机会的背景知识。当然如果没有这个先验知识的话,在实际处理中,我们可以简单地将每一种假设都赋给一个相同的概率。类似,P(D)代表将要观察的训练样本数据D的先验概率(也就是说,在没有确定某一个假设成立时D的概率)。然后是P(D/h),它表示假设h成立时观察到数据D的概率。在机器学习中,我们感兴趣的是P(h/D),也就是给定了一个训练样本数据D,判断假设h成立的概率,这也称之为后验概率,它反映了在看到训练样本数据D后假设h成立的置信度。(注:后验概率p(h/D)反映了训练数据D的影响,而先验概率p(h)是独立于D的)。

 

P(h|D) = P(D|h)P(h)/p(D),从贝叶斯公式可以看出,后验概率p(h/D)取决于P(D|h)P(h)这个乘积,呵呵,这就是贝叶斯分类算法的核心思想。我们要做的就是要考虑候选假设集合H,并在其中寻找当给定训练数据D时可能性最大的假设hh属于H)。

      简单点说,就是给定了一个训练样本数据(样本数据已经人工分类好了),我们应该如何从这个样本数据集去学习,从而当我们碰到新的数据时,可以将新数据分类到某一个类别中去。那可以看到,上面的贝叶斯理论和这个任务是吻合的。

朴素贝叶斯分类

 

也许你觉得这理论还不是很懂,那我再举个简单的例子,让大家对这个算法的原理有个快速的认识。(注:这个示例摘抄自《机器学习》这本书的第三章的表3-2.

假设给定了如下训练样本数据,我们学习的目标是根据给定的天气状况判断你对PlayTennis这个请求的回答是Yes还是No

Day

Outlook

Temperature

Humidity

Wind

PlayTennis

D1

Sunny

Hot

High

Weak

No

D2

Sunny

Hot

High

Strong

No

D3

Overcast

Hot

High

Weak

Yes

D4

Rain

Mild

High

Weak

Yes

D5

Rain

Cool

Normal

Weak

Yes

D6

Rain

Cool

Normal

Strong

No

D7

Overcast

Cool

Normal

Strong

Yes

D8

Sunny

Mild

High

Weak

No

D9

Sunny

Cool

Normal

Weak

Yes

D10

Rain

Mild

Normal

Weak

Yes

D11

Sunny

Mild

Normal

Strong

Yes

D12

Overcast

Mild

High

Strong

Yes

D13

Overcast

Hot

Normal

Weak

Yes

D14

Rain

Mild

High

Strong

No

 可以看到这里样本数据集提供了14个训练样本,我们将使用此表的数据,并结合朴素贝叶斯分类器来分类下面的新实例:

(Outlook = sunny,Temprature = cool,Humidity = high,Wind = strong)

我们的任务就是对此新实例预测目标概念PlayTennis的目标值(yesno).

由上面的公式可以得到:

可以得到:

      P(PlayTennis =yes) = 9/14 = 0.64,P(PlayTennis=no)=5/14 = 0.36

      P(Wind=Stong| PlayTennis =yes)=3/9=0.33,p(Wind=Stong| PlayTennis =no)=3/5 = 0.6

其他数据类似可得,代入后得到:

P(yes)P(Sunny|yes)P(Cool|yes)P(high|yes)P(Strong|yes) = 0.0053

P(no)P(Sunny|no)P(Cool|no)P(high|no)P(Strong|no)=0.0206

因此应该分类到no这一类中。

 

贝叶斯文本分类算法

      好了,现在开始进入本文的主旨部分:如何将贝叶斯分类器应用到中文文本的分类上来?

根据联合概率公式(全概率公式)

 

M——训练文本集合中经过踢出无用词去除文本预处理之后关键字的数量。

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。

posted on 2008-10-21 14:49 Phinecos(洞庭散人) 阅读(13145) 评论(29) 编辑 收藏

评论

#1楼[楼主] 2008-10-21 15:06 Phinecos(洞庭散人)      

自己坐个沙发,欢迎指教,下部还在写作中,很快放上来  回复 引用 查看   

#2楼 2008-10-21 15:27 悟不透      

看了个开头,费劲回想这些怪异的公式符号来看懂文章已经导致了我大脑几乎抽筋。
岁月不饶人啊。回复一个再慢慢看吧。
 回复 引用 查看   

#3楼 2008-10-21 15:32 fwaef[未注册用户]

ls的,基于贝叶斯的机器学习是最简单的了, 还没上神经网络呢,呵呵  回复 引用   

#4楼[楼主] 2008-10-21 15:33 Phinecos(洞庭散人)      

@fwaef
呵呵,是的,这确实是很简单的分类模型了,
 回复 引用 查看   

#5楼[楼主] 2008-10-21 15:33 Phinecos(洞庭散人)      

@悟不透
理论无聊,待会直接看代码吧,呵呵
 回复 引用 查看   

#6楼 2008-10-21 15:42 悟不透      

@fwaef
谁让咱上学的时候就忙着想怎么不上课了呢。
现在脑袋抽筋哎。
自己经受到教训以后才知道痛心:(
 回复 引用 查看   

#7楼 2008-10-21 16:15 球球      

傻傻的看了5分钟,最后明白过来了,这不逆概率的公式嘛,只不过可能有个别名叫贝叶斯公式........真的差点“被噎死”了。  回复 引用 查看   

#8楼[楼主] 2008-10-21 16:17 Phinecos(洞庭散人)      

@球球
见《概率论和数理统计》课本第一章
 回复 引用 查看   

#9楼 2008-10-21 16:18 球球      

@Phinecos(洞庭散人)
毕业8年了,上哪还记得别名,能记得逆概已经不错了.....
 回复 引用 查看   

#10楼 2008-10-21 16:53 so funny[未注册用户]

定义 设S为试验E的样本空间,B1, B2, …Bn为E的一组事件,若BiBj≠Ф, i≠j, i, j=1, 2, …,n; B1∪B2∪…∪Bn=S则称B1, B2, …, Bn为样本空间的一个划分。

呃,一个划分好像不该有交集吧……集合论里说的……
 回复 引用   

#11楼[楼主] 2008-10-21 17:03 Phinecos(洞庭散人)      

@so funny
哦,是错了,修正
 回复 引用 查看   

#12楼 2008-10-22 11:46 巫云      

真强,把书都搬上了,兄弟辛苦了!  回复 引用 查看   

#13楼[楼主] 2008-10-22 20:42 Phinecos(洞庭散人)      

@巫云
懒得写了,直接copy
 回复 引用 查看   

#14楼 2008-10-23 16:04 自由[未注册用户]

年纪大了,慢慢看  回复 引用   

#15楼 2008-11-20 21:23 杨海[未注册用户]

我只能说老兄你很牛
谢谢你
我在做这个的毕业设计!
一直找不到想要的资料!
 回复 引用   

#16楼 2009-04-28 09:23 王迎春[未注册用户]


@Phinecos(洞庭散人)
你好,我是本科学数学的,现在在上计算机的研究生,看了你的帖子,我觉得非常棒,最近我准备做一场关于贝叶斯的报告,你所说的这些内容我都懂,但是我不知道该怎么组织,谢谢你组织出这么优秀的帖子。思路太清晰了。我还要准备贝叶斯信念网络和层次贝叶斯的分类过程,不知道你对这方面有研究么??我找不到资料看。希望你能提供帮助给我。我的邮箱:yingchun48@sina.com
希望能和大家共同交流。
 回复 引用   

#17楼 2009-06-15 03:15 gglong[未注册用户]

Bayes定理有没有写错?按书上说的
P(B)=∑P(B|Aj)P(Aj)
P(Ai∣B)=P(B|Ai)P(Ai)/P(B)
得到
P(Ai∣B)=P(B|Ai)P(Ai)/∑P(B|Aj)P(Aj)
就算换一下AB得到
P(Bi|A)=P(A | Bi)P(Bi)/∑P(A | Bj)P(Bj)

怎么会是这个呢
P(Bi∣A)=P(A∣Bi)P(Bi)/∑P(B|Aj)P(Aj)=P(B|Ai)P(Ai)/P(B)
请教
 回复 引用   

#18楼 2009-06-15 03:34 gglong[未注册用户]

假设现在有一个新病人,化验测试返回阳性,是否将病人断定为有癌症呢?我们可以来计算极大后验假设:
P(阳性|cancer)p(cancer)=0.98*0.008 = 0.0078
P(阳性|无cancer)*p(无cancer)=0.03*0.992 = 0.0298
因此,应该判断为无癌症。


这个结论有点不可思议。这里应该计算的是p(cancer|阳性)=P(cancer)P(+|c)/P(+)=0.2085,由此可以得出得癌症的可能性并不大。
什么是极大后验假设,怎么就由检出是阳性和极大后验假设就得出无癌症的呢?
我新学,如果方便请您解释一下
 回复 引用   

#19楼 2009-07-25 14:35 easier[未注册用户]

癌症病人的例子写错了吧。求的应该是P(cancer|阳性)  回复 引用   

#20楼 2009-08-31 11:12 小阿[未注册用户]

谢谢楼上两位,我说我看了半天没看明白。。。  回复 引用   

#21楼 2009-09-18 10:38 Google优化      

写得不错!跟书上有什么区别吗?google优化  回复 引用 查看   

#22楼 2009-11-23 09:00 encoreway[未注册用户]

@easier
没有错的。。
 回复 引用   

#23楼 2010-01-01 20:36 weicheng      

M——训练文本集合中经过踢出无用词去除文本预处理之后关键字的数量。
但是楼主在程序实现中取值0,是不是错了啊?M是否可以详细解释一下。
 回复 引用 查看   

#24楼 2010-11-10 19:41 Leo Zhang      

“贝叶斯文本分类算法”这一节的公式3有问题吧,分母因该是:p(x1,x2,x3......xn)  回复 引用 查看   

#25楼 2010-11-10 19:43 Leo Zhang      

还有公式8应该是进行了Laplace校准了吧  回复 引用 查看   

#26楼 2010-12-06 14:53 专心做一件事      

贝叶斯公式写错了吧。。。。。。。。。。。  回复 引用 查看   

#27楼 2011-07-19 16:52 过路狼      

“贝叶斯文本分类算法”这一节的公式3有问题吧,分母因该是:p(x1,x2,x3......xn)
是不是搞错了?
 回复 引用 查看   

#28楼 2011-07-19 16:53 过路狼      

博主出来澄清下啊……  回复 引用 查看   

#29楼 2011-08-01 08:54 what to say      

Bayes定理等号左边写错了,应该是P(Ai|B)而不是P(Bi∣A)  回复 引用 查看   

导航

统计

公告




联系方式
新浪微博:http://weibo.com/phinecos
Email: phinecos@gmail.com
昵称:Phinecos(洞庭散人)
园龄:5年9个月
粉丝:219
关注:0

搜索

 

随笔分类(734)

随笔档案(596)

常去的站点

我的好友

我的站点

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜