我是靠谱客的博主 温暖冰棍,最近开发中收集的这篇文章主要介绍垃圾邮件识别任务中朴素贝叶斯分类算法的使用思路,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

垃圾邮件识别任务中朴素贝叶斯分类算法的使用思路

判断一个邮件是否是垃圾邮件:

step1. 训练模型过程:

1.计算先验概率:
如现有200封正常邮件,100封垃圾邮件可得到:

P ( 正 常 邮 件 ) = 200 200 + 100 = 2 3 P(正常邮件)=frac{200}{200+100}=frac{2}{3} P()=200+100200=32

P ( 垃 圾 邮 件 ) = 100 200 + 100 = 1 3 P(垃圾邮件)=frac{100}{200+100}=frac{1}{3} P()=200+100100=31
2.生成词库:

把总共300封邮件中出现的所有文本分词后,填入词库,得到包含所有出现过的词的词库 V V V
假设词库 V V V中有3000个词则 L e n ( V ) = 3000 Len(V)=3000 Len(V)=3000

3.计算词库中每一个词在正常邮件和垃圾邮件中出现的概率:
如“点击”这个词在20个正常邮件中出现过,在60个垃圾邮件中出现过,假设一个邮件中有20个词则:

“点击”在正常邮件中出现的概率为:
P ( 点 击 ∣ 正 常 邮 件 ) = 20 200 ∗ 20 = 1 200 P(点击|正常邮件)=frac{20}{200*20}=frac{1}{200} P()=2002020=2001

“点击”在垃圾邮件中出现的概率为:
P ( 点 击 ∣ 垃 圾 邮 件 ) = 20 100 ∗ 20 = 1 100 P(点击|垃圾邮件)=frac{20}{100*20}=frac{1}{100} P()=1002020=1001

但是由于一些情况如“特惠”这个词在垃圾邮件中出现过,但是在正常邮件中没有出现导致:
P ( 特 惠 ∣ 正 常 邮 件 ) = 0 200 ∗ 20 = 0 P(特惠|正常邮件)=frac{0}{200*20}=0 P()=200200=0

所以这里要采用一个平滑技术 ,朴素贝叶斯中一般使用Add-one Smoothing
即如果出现次数为零,为了让值不为零,分子需要+1,分母需要加上词库的大小 L e n ( V ) = 3000 Len(V)=3000 Len(V)=3000,因此:

“点击”在正常邮件中出现的概率为:
P ( 点 击 ∣ 正 常 邮 件 ) = 20 + 1 200 ∗ 20 + 3000 = 3 1000 P(点击|正常邮件)=frac{20+1}{200*20+3000}=frac{3}{1000} P()=20020+300020+1=10003

“点击”在垃圾邮件中出现的概率为:
P ( 点 击 ∣ 垃 圾 邮 件 ) = 20 + 1 100 ∗ 20 + 3000 = 1 250 P(点击|垃圾邮件)=frac{20+1}{100*20+3000}=frac{1}{250} P()=10020+300020+1=2501

……
以此推类,分别计算出词库 V V V中每一个词在正常邮件及垃圾邮件中出现的概率

假设这里得到了:
P ( 点 击 ∣ 正 常 邮 件 ) = 3 1000 P(点击|正常邮件)=frac{3}{1000} P()=10003
P ( 点 击 ∣ 垃 圾 邮 件 ) = 1 250 P(点击|垃圾邮件)=frac{1}{250} P()=2501

P ( 链 接 ∣ 正 常 邮 件 ) = 1 5000 P(链接|正常邮件)=frac{1}{5000} P()=50001
P ( 链 接 ∣ 垃 圾 邮 件 ) = 1 230 P(链接|垃圾邮件)=frac{1}{230} P()=2301

P ( 购 买 ∣ 正 常 邮 件 ) = 7 2200 P(购买|正常邮件)=frac{7}{2200} P()=22007
P ( 购 买 ∣ 垃 圾 邮 件 ) = 1 310 P(购买|垃圾邮件)=frac{1}{310} P()=3101

P ( 工 作 ∣ 正 常 邮 件 ) = 1 210 P(工作|正常邮件)=frac{1}{210} P()=2101
P ( 工 作 ∣ 垃 圾 邮 件 ) = 1 5000 P(工作|垃圾邮件)=frac{1}{5000} P()=50001
……

当所有单词的概率计算完成后朴素贝叶斯模型就训练完毕。




step2.预测过程:

预测的最终目标是判断:
比较 P ( 正 常 邮 件 ∣ 内 容 ) P(正常邮件|内容) P() P ( 垃 圾 邮 件 ∣ 内 容 ) P(垃圾邮件|内容) P()

根据贝叶斯公式

对比 P ( 正 常 邮 件 ∣ 内 容 ) P(正常邮件|内容) P() P ( 垃 圾 邮 件 ∣ 内 容 ) P(垃圾邮件|内容) P()

相当于对比 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) P ( 内 容 ) frac{P(内容|正常邮件)P(正常邮件)}{P(内容)} P()P()P() P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P ( 内 容 ) frac{P(内容|垃圾邮件)P(垃圾邮件)}{P(内容)} P()P()P()

由于分母相同,所以

相当于对比 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) P(内容|正常邮件)P(正常邮件) P()P() P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|垃圾邮件)P(垃圾邮件) P()P()的大小

假如此时收到了一封新邮件,邮件中包含很多词,其中有“工作”、“购买”,“链接”,“点击” ……等等

1.计算: P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) P(内容|正常邮件)P(正常邮件) P()P()

P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) = ( P ( 工 作 ∣ 正 常 邮 件 ) × P ( 购 买 ∣ 正 常 邮 件 ) × P ( 链 接 ∣ 正 常 邮 件 ) × . . . . × P ( 点 击 ∣ 正 常 邮 件 ) ) × P ( 正 常 邮 件 ) = ( 1 210 × 7 2200 × 1 5000 × . . . . × 3 1000 ) × 2 3 P(内容|正常邮件)P(正常邮件)=(P(工作|正常邮件)times P(购买|正常邮件)times P(链接|正常邮件)times ....times P(点击|正常邮件))times P(正常邮件)=(frac{1}{210}timesfrac{7}{2200}timesfrac{1}{5000}times ....timesfrac{3}{1000})times frac{2}{3} P()P()=(P()×P()×P()×....×P())×P()=(2101×22007×50001×....×10003)×32

2.计算: P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|垃圾邮件)P(垃圾邮件) P()P()

P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) = ( P ( 工 作 ∣ 垃 圾 邮 件 ) × P ( 购 买 ∣ 垃 圾 邮 件 ) × P ( 链 接 ∣ 垃 圾 邮 件 ) × . . . . × P ( 点 击 ∣ 垃 圾 邮 件 ) ) × P ( 垃 圾 邮 件 ) = ( 1 5000 × 1 310 × 1 230 × . . . . × 1 250 ) × 1 3 P(内容|垃圾邮件)P(垃圾邮件)=(P(工作|垃圾邮件)times P(购买|垃圾邮件)times P(链接|垃圾邮件)times ....times P(点击|垃圾邮件))times P(垃圾邮件)=(frac{1}{5000}timesfrac{1}{310}timesfrac{1}{230}times ....timesfrac{1}{250})times frac{1}{3} P()P()=(P()×P()×P()×....×P())×P()=(50001×3101×2301×....×2501)×31

这里也可以看到有非常多类似 P ( 工 作 ∣ 垃 圾 邮 件 ) P(工作∣垃圾邮件) P()的值在相乘,如果其中有任何一个值等于0的话,会导致整个式子等于0。这也是为什么要做Smoothing平滑处理

3.对比第一步和第二步计算出的值

如果 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) > = P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|正常邮件)P(正常邮件)>=P(内容|垃圾邮件)P(垃圾邮件) P()P()>=P()P()则预测此邮件为正常邮件
如果 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) < P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|正常邮件)P(正常邮件)<P(内容|垃圾邮件)P(垃圾邮件) P()P()<P()P()则预测此邮件为垃圾邮件

需要注意的点:

当词库数量非常大时,每一个类似 P ( 工 作 ∣ 垃 圾 邮 件 ) P(工作∣垃圾邮件) P()的值会非常非常小,小数位过多时导致计算机不能存储。会报underflow错误
都知道 L o g Log Log是个严格递增函数所以step2.预测过程中第一步和第二步的式子也可以转化成:

L o g ( P ( 内 容 ∣ 正 常 邮 件 ) ) P ( 正 常 邮 件 ) = L o g ( ( P ( 工 作 ∣ 正 常 邮 件 ) × P ( 购 买 ∣ 正 常 邮 件 ) × P ( 链 接 ∣ 正 常 邮 件 ) × . . . . × P ( 点 击 ∣ 正 常 邮 件 ) ) × P ( 正 常 邮 件 ) = ( log ⁡ 1 210 + log ⁡ 7 2200 + log ⁡ 1 5000 + . . . . + log ⁡ 3 1000 ) × 2 3 Log(P(内容|正常邮件))P(正常邮件)=Log((P(工作|正常邮件)times P(购买|正常邮件)times P(链接|正常邮件)times ....times P(点击|正常邮件))times P(正常邮件)=(log{frac{1}{210}}+log{frac{7}{2200}}+log{frac{1}{5000}}+....+log{frac{3}{1000}})times frac{2}{3} Log(P())P()=Log((P()×P()×P()×....×P())×P()=(log2101+log22007+log50001+....+log10003)×32(以正常邮件举例,如果正常邮件做了这个处理那么垃圾邮件也要做这个处理)

PS

以上为学习过程中的对网络上资料的内容整理及理解

最后

以上就是温暖冰棍为你收集整理的垃圾邮件识别任务中朴素贝叶斯分类算法的使用思路的全部内容,希望文章能够帮你解决垃圾邮件识别任务中朴素贝叶斯分类算法的使用思路所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部