一、贝叶斯过滤算法的基本步骤1)、收集大量的垃圾邮件和非垃圾邮件,建立垃圾邮件集和非垃圾邮件集;2)、提取邮件主题和邮件体中的独立字串例如 ABC32,¥234等作为TOKEN串并统计提取出的TOKEN串出现的次数即字频。
按照上述的方法分别处理垃圾邮件集和非垃圾邮件集中的所有邮件;3)、每一个邮件集对应一个哈希表,Hashtable_Good对应非垃圾邮件集而Hashtable_Bad对应垃圾邮件集。
表中存储TOKEN串到字频的映射关系;4)、计算每个哈希表中TOKEN串出现的概率P=(某TOKEN串的字频)/(对应哈希表的长度);5)、综合考虑hashtable_good和hashtable_bad,推断出当新来的邮件中出现某个TOKEN串时,该新邮件为垃圾邮件的概率。
数学表达式为:A事件——邮件为垃圾邮件;t1,t2 ,...,tn代表TOKEN串则P(A|ti)表示在邮件中出现TOKEN串ti时,该邮件为垃圾邮件的概率。
设P1(ti)=(ti在hashtable_good中的值)P2(ti)=(ti在hashtable_ bad中的值)则 P(A|ti)= P1(ti)/[(P1(ti)+ P2(ti)];6)、建立新的哈希表 hashtable_probability存储TOKEN串ti到P(A|ti)的映射;7)、至此,垃圾邮件集和非垃圾邮件集的学习过程结束。
根据建立的哈希表Hashtable_Probability可以估计一封新到的邮件为垃圾邮件的可能性。
当新到一封邮件时,按照步骤2)生成TOKEN串。
查询hashtable_probability 得到该TOKEN 串的键值。
假设由该邮件共得到N个TOKEN串,t1,t2…….tn, hashtable_probability 中对应的值为P1,P2,。
PN,P(A|t1 ,t2, t3……tn)表示在邮件中同时出现多个TOKEN串t1,t2…….tn时,该邮件为垃圾邮件的概率。
由复合概率公式可得P(A|t1 ,t2, t3……tn)=(P1*P2*。
PN)/[P1*P2*。
PN+(1-P1)*(1-P2)*。
(1-PN)]当P(A|t1 ,t2, t3……tn)超过预定阈值时,就可以判断邮件为垃圾邮件。
二、贝叶斯过滤算法举例例如:一封含有“法轮功”字样的垃圾邮件 A和一封含有“法律”字样的非垃圾邮件B根据邮件A生成hashtable_ bad,该哈希表中的记录为法:1次轮:1次功:1次计算得在本表中:法出现的概率为0.3轮出现的概率为0.3功出现的概率为0.3根据邮件B生成hashtable_good,该哈希表中的记录为:法:1律:1计算得在本表中:法出现的概率为0.5律出现的概率为0.5综合考虑两个哈希表,共有四个TOKEN串:法轮功律当邮件中出现“法”时,该邮件为垃圾邮件的概率为:P=0.3/(0.3+0.5)= 0.375出现“轮”时:P=0.3/(0.3+0)= 1出现“功“时:P=0.3/(0.3+0)= 1出现“律”时P=0/(0+0.5)= 0;由此可得第三个哈希表:hashtable_probability 其数据为:法:0.375轮:1功:1律:0当新到一封含有“功律”的邮件时,我们可得到两个TOKEN串,功律查询哈希表hashtable_probability可得P(垃圾邮件| 功)= 1P (垃圾邮件|律)= 0此时该邮件为垃圾邮件的可能性为:P=(0 * 1)/[ 0 * 1 +(1-0)*(1-1)] = 0由此可推出该邮件为非垃圾邮件基于朴素贝叶斯分类器的文本分类算法(上)本文缘起于最近在读的一本书-- 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(B|Aj)P(Aj)=P(B|Ai)P(Ai)/P(B)称为贝叶斯公式。
说明:i,j均为下标,求和均是1到n下面我再举个简单的例子来说明下。
示例1考虑一个医疗诊断问题,有两种可能的假设:(1)病人有癌症。
(2)病人无癌症。
样本数据来自某化验测试,它也有两种可能的结果:阳性和阴性。
假设我们已经有先验知识:在所有人口中只有0.008的人患病。
此外,化验测试对有病的患者有98%的可能返回阳性结果,对无病患者有97%的可能返回阴性结果。
上面的数据可以用以下概率式子表示:P(cancer)=0.008,P(无cancer)=0.992P(阳性|cancer)=0.98,P(阴性|cancer)=0.02P(阳性|无cancer)=0.03,P(阴性|无cancer)=0.97假设现在有一个新病人,化验测试返回阳性,是否将病人断定为有癌症呢?我们可以来计算极大后验假设:P(阳性|cancer)p(cancer)=0.98*0.008 = 0.0078P(阳性|无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时可能性最大的假设h(h属于H)。
简单点说,就是给定了一个训练样本数据(样本数据已经人工分类好了),我们应该如何从这个样本数据集去学习,从而当我们碰到新的数据时,可以将新数据分类到某一个类别中去。
那可以看到,上面的贝叶斯理论和这个任务是吻合的。
朴素贝叶斯分类也许你觉得这理论还不是很懂,那我再举个简单的例子,让大家对这个算法的原理有个快速的认识。
(注:这个示例摘抄自《机器学习》这本书的第三章的表3-2.)假设给定了如下训练样本数据,我们学习的目标是根据给定的天气状况判断你对PlayTennis这个请求的回答是Yes还是No。
可以看到这里样本数据集提供了14个训练样本,我们将使用此表的数据,并结合朴素贝叶斯分类器来分类下面的新实例:(Outlook = sunny,Temprature = cool,Humidity = high,Wind = strong) 我们的任务就是对此新实例预测目标概念PlayTennis的目标值(yes或no).由上面的公式可以得到:可以得到:P(PlayTennis =yes) = 9/14 = 0.64,P(PlayTennis=no)=5/14 = 0.36P(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.0053P(no)P(Sunny|no)P(Cool|no)P(high|no)P(Strong|no)=0.0206因此应该分类到no这一类中。
贝叶斯文本分类算法好了,现在开始进入本文的主旨部分:如何将贝叶斯分类器应用到中文文本的分类上来?根据联合概率公式(全概率公式)M——训练文本集合中经过踢出无用词去除文本预处理之后关键字的数量。
基于朴素贝叶斯分类器的文本分类算法(下)文本的分类和聚类是一个比较有意思的话题,我以前也写过一篇blog《基于K-Means的文本聚类算法》,加上最近读了几本数据挖掘和机器学习的书籍,因此很想写点东西来记录下学习的所得。
在本文的上半部分《基于朴素贝叶斯分类器的文本分类算法(上)》一文中简单介绍了贝叶斯学习的基本理论,这一篇将展示如何将该理论运用到中文文本分类中来,具体的文本分类原理就不再介绍了,在上半部分有,也可以参见代码的注释。
文本特征向量文本特征向量可以描述为文本中的字/词构成的属性。
例如给出文本:Good good study,Day day up.可以获得该文本的特征向量集:{ Good, good, study, Day, day , up.}朴素贝叶斯模型是文本分类模型中的一种简单但性能优越的的分类模型。
为了简化计算过程,假定各待分类文本特征变量是相互独立的,即“朴素贝叶斯模型的假设”。