问题描述
贝叶斯算法介绍一.贝叶斯过滤算法的基本步骤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)]这里分子中当有一个pi是0时分子为零,分母中当有一个pi为1有一个为0时,分母就为零,而且很容易出现啊,所以很不准确。跪求解决方法。。当P(A|t1,t2,t3……tn)超过预定阈值时,就可以判断邮件为垃圾邮件。二.贝叶斯过滤算法举例例如:一封含有“fa轮功”字样的垃圾邮件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由此可推出该邮件为非垃圾邮件
解决方案
解决方案二:
分子和分母都是0的结果就是NAN,说明你的词库还不够大不够全。
解决方案三:
引用楼主wangzhenhappy1的回复:
这里分子中当有一个pi是0时分子为零,分母中当有一个pi为1有一个为0时,分母就为零,而且很容易出现啊,所以很不准确。跪求解决方法。。
pi是0时,此时应该去掉该项pi。
解决方案四:
引用2楼sgcl的回复:
引用楼主wangzhenhappy1的回复:这里分子中当有一个pi是0时分子为零,分母中当有一个pi为1有一个为0时,分母就为零,而且很容易出现啊,所以很不准确。跪求解决方法。。pi是0时,此时应该去掉该项pi。
这样做是不对的完全允许pi为0说明词库中没有出现该词,你把它剔除了还不如把那个词抹掉呢
解决方案五:
谢谢大家的看法我的情况具体是:用一些垃圾邮件和合法邮件进行自学习,建立hashtable_probability,然后就可以对新来的一份邮件进行判断其是不是垃圾邮件。但是,对自学习中用到的垃圾邮件或者合法邮件进行测试,应该是百分之百的准确率。但是,分子和分母很容易为0,这也好理解,因为有可能一些词汇在自学习中的垃圾邮件和合法邮件集中都出现过。不知怎么解决