CZoneSoft

Live simply to express my ambition (原淡蓝随笔) - CZoneSoft 致力于视频/虚拟现实的应用开发 承接软件开发

首页 新随笔 联系 订阅 管理
  136 Posts :: 8 Stories :: 1943 Comments :: 4 Trackbacks

一. 贝叶斯过滤算法的基本步骤

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(垃圾邮件| 功)=1
P (垃圾邮件|律)=0
此时该邮件为垃圾邮件的可能性为:
P=(0*1)/[0*1+(1-0)*(1-1)]=0
由此可推出该邮件为非垃圾邮件

相关的:字频分析结果出来了

posted on 2005-07-19 22:06 陈震军 阅读(2804) 评论(5)  编辑 收藏 网摘 所属分类: C#/C++

Feedback

#1楼  2005-07-20 10:18 jackyrong      
那请问预定阕值如何计算呢?
  回复  引用  查看    

#2楼 [楼主] 2005-08-02 09:39 陈震军      
阕(?误) 值手工设定,界面上给个滑杆,只定了三级(弱、中、强)。用户自己决定。
  回复  引用  查看    

#3楼  2005-11-04 23:41 hustvag [未注册用户]
你这个算法是自己想出来的还是现在通用的贝叶斯算法?我觉得有点漏洞。

对于本例而言,设A代表邮件为垃圾的事件,B代表邮件不是垃圾的事件。A,B是一个完备的事件组。事件Ti则是在邮件中出现某一个字符Ti。当Ti出现在邮件中的时候,这封邮件为垃圾邮件的可能性是一种后验概率。根据贝叶斯公式
P(A|Ti)=P(A)*P(Ti|A)/[P(A)*P(Ti|A)+P(B)*P(Ti|B)]
很显然,原文中有个默认的假设:P(A)=P(B)=0.5,即正常邮件与垃圾邮件各占一半。这一点没有交代出来。只有这个假设成立才有
P(A|Ti)=P(Ti|A)/[P(Ti|A)+P(Ti|B)]










  回复  引用    

P(A)+P(B)=1,而不是P(A)=P(B)=0.5,这是条件
  回复  引用    

#5楼  2008-01-22 10:01 frank_van [未注册用户]
P(A)=P(B)=0.5应该是先验分布。
从P(A)+P(B)=1推不出P(A|Ti)=P(Ti|A)/[P(Ti|A)+P(Ti|B)]
  回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: