判断一个邮件是否是垃圾邮件:
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(点击∣正常邮件)=200∗2020=2001
“点击”在垃圾邮件中出现的概率为:
P ( 点 击 ∣ 垃 圾 邮 件 ) = 20 100 ∗ 20 = 1 100 P(点击|垃圾邮件)=\frac{20}{100*20}=\frac{1}{100} P(点击∣垃圾邮件)=100∗2020=1001
但是由于一些情况如“特惠”这个词在垃圾邮件中出现过,但是在正常邮件中没有出现导致:
P ( 特 惠 ∣ 正 常 邮 件 ) = 0 200 ∗ 20 = 0 P(特惠|正常邮件)=\frac{0}{200*20}=0 P(特惠∣正常邮件)=200∗200=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(点击∣正常邮件)=200∗20+300020+1=10003
“点击”在垃圾邮件中出现的概率为:
P ( 点 击 ∣ 垃 圾 邮 件 ) = 20 + 1 100 ∗ 20 + 3000 = 1 250 P(点击|垃圾邮件)=\frac{20+1}{100*20+3000}=\frac{1}{250} P(点击∣垃圾邮件)=100∗20+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
……
当所有单词的概率计算完成后朴素贝叶斯模型就训练完毕。
预测的最终目标是判断:
比较 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}\times\frac{7}{2200}\times\frac{1}{5000}\times ....\times\frac{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}\times\frac{1}{310}\times\frac{1}{230}\times ....\times\frac{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(工作∣垃圾邮件)的值会非常非常小,小数位过多时导致计算机不能存储。会报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(以正常邮件举例,如果正常邮件做了这个处理那么垃圾邮件也要做这个处理)
以上为学习过程中的对网络上资料的内容整理及理解