关于贝叶斯公式在垃圾邮件过滤中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于贝叶斯公式在垃圾邮件过滤中的应用一、贝叶斯公式的一些基本概念
P(t
x |A)=
P(A|t
x
)*P(t
x
)
P(A|t
i
)*P(t
i
)
i=1
n
å
在这其中,P(A|t)为后验概率:即知道了结果后,得到的反向概率
P(t|A)为先验概率:事件发生前基于某些因素的预判概率
在贝叶斯公式出现之前,我们没有办法在不知道现实具体条件的情况下直接得
到某个事件的概率。
举一个这两者的直观例子,比如说输入法在判断人输入词语方面:t1为事件人输入anger,A为事件人输入ang。
因为程序无法在输入之前判定人到底要输入哪个词,先验概率无法直接求得,需要使用后验概率。
贝叶斯公式将先验概率与后验概率建立了联系,当我们得到某个事件大量的结果后,可以通过结果与原因的关系求得后验概率,从而求得先验概率。
还是输入法的例子:
设t1为人输入anger,t2为人输入angle(姑且先把范围局限在这里),A为人输入ang。
我们可以通过分析大量文章得到P(t1)和P(t2),即词频。
而P(A|t1)和P(A|t2)分别是,输入了t1/t2的情况下,想要输入A的概率。
这个概率可以认为是相似性,通过分析”ang”与”angry”、”angle”在键盘上的“编辑距离”确定(因为只有两个词,所以很容易知道angle比angry更难打出,因此离ang的距离更远,这个概率更低。
这个概率通过比较词库中的各个单词来得到,具体的实施方法比较复杂,见链接1)
因为所有P(ti)∝P(A|ti)*P(ti),所以我们只要考虑词频和相似性的乘积,就可以得到输入纠错的词了。
这个例子帮我建立了关于贝叶斯公式最基本而直观的概念,即先验概率和后验概率两个难以分别的概念,非常有意思。
二、贝叶斯概率与贝叶斯主义
一个很令我惊讶的事情是,主观贝叶斯概率观将概率看做了个人主观的事件,也就是说,概率只是一个人对事件发生概率的估计,是依托于主观观察的。
因此某件事情的概率并不是一成不变,而是随着事件的进展,根据新的信息进行不断地修正。
而修正所用到的正是我们一直使用的,平淡无奇的贝叶斯公式。
再举一个例子体现贝叶斯概率观。
比如说抛一枚硬币抛了10下,其中9下朝上,
1次朝下,现在要抛第11次,让你判断一下抛硬币朝上的概率。
如果将概率看作是客观不变的数字,不管前面的结果如何,都会得到1/2的结论。
但是如果使用贝叶斯公式进行计算的话,就不是那么回事了。
假设硬币抛一次向上的概率为θ,并且将这个硬币是概率为θ的硬币表示为事件θ(所以说,不认为就是一个1/2,而是认为是个未知数)
假设第十一次抛正面为事件+
P (+|(9,1))=P (+|q )*P (q |(9,1))d q 01
ò←这一步为全概率公式
上式中,我们知道P(+|θ)=θ。
P (q |(9,1))=P ((9,1)|q )*P (q )P (9,1)
←贝叶斯公式 P(θ)是你对这个硬币的置信程度。
就是说,你对这个硬币抛一次向上的概率为θ有多大的信任程度。
θ越大,得到的图形越尖。
(虽然知道了这个数据的意义,但是对于这个数据如何得到我有点难以理解)
将上两式结合就可以得到,
P (+|(9,1))=1P (9,1)P (+|q )*P ((9,1)|q )*P (q )d q ò=1P (9,1)
10*q 10*(1-q )P (q )d q ò
以上的思路推导来自于链接2
……说实话,我觉得我花了太多时间在抛硬币上了,而且仍然没有搞懂抛硬币的Bate 分布在讲什么,最后就放弃自己搞懂它了……
三、 垃圾邮件过滤
无论如何,通过以上两个非常有趣的例子,我知道了贝叶斯概率公式的一些应用。
这些应用无一例外都需要先得到大量的数据进行分析,然后得到比较可靠的后验概率。
垃圾邮件的过滤也是这样。
首先,你要有非常多的邮件,包括垃圾邮件和非垃圾邮件。
将两种邮件进行分类,分成两个集。
通过算法从两个集的邮件中提取出字串,随意举例,比如t1:ABCDJ ,t2:Korean food ,t3:……然后可以很容易得到t1、t2……在所有邮件中的字频。
构建哈希表Nspam 和spam ,表中存储字串到字频的映射关系。
然后我们设P1(ti)为ti 在Nspam 中的频率,P2(ti)为ti 在spam 中的频率。
容易得到,P1(ti)=(ti 在所有邮件中的字频)/(Nspam 的大小),同理P2(ti)。
然后我们就可以把哈希表里的映射修改为字串到集中字频的映射关系。
假设某封邮件是垃圾邮件为事件A ,那么“在收到词ti 的情况下,这封邮件是垃圾邮件”,被表述为A|ti 。
利用贝叶斯公式,它的概率
P(A|ti)=
P1(ti)
P1(ti)+P2(ti)
(实际上P1(ti)即为P(ti*A))
仿佛感觉在成功过滤垃圾邮件的道路上走出了深刻的一步…………
但是垃圾邮件好像不只有一个词,也就是说我们在检索收到的垃圾邮件然后得到了很多词t1,t2,t3,…,ti之后,要知道的应该是“同时收到t1,t2,t3,…,ti的情况下,这封邮件是垃圾邮件”这件事情的概率。
P(A|t1t2t3¼ti)=
P1(t1)P1(t2)¼P1(ti)
P1(t1)P1(t2)¼P1(ti)+(1-P1(t1))(1-P1(t2))¼(1-P1(ti))
就是这样。
P1(t1)P1(t2)¼P1(ti)指“全部收到这些词的情况下是垃圾邮件”,而(1-P1(t1))(1-P1(t2))¼(1-P1(ti))指“全部收到这些词结果竟然不是垃圾邮件”。
然后你就可以通过这个方法再检验很多邮件,然后设置一个P的阈值。
当超过某个阈值之后,就可以判定邮件是垃圾邮件了。
四、总结
我觉得,这些东西,理解起来最难的还是抛硬币……老师求解惑……
然后输入法自动纠错功能中,通过算法计算输入距离这点的实现方法很厉害,太精妙了。
垃圾邮件过滤这件事情,乍一听感觉非常麻烦,但是通过原理解释之后,发现贝叶斯算法太厉害了什么都能干,原理简洁明了。
(但是字串的提取也很麻烦……。