条件概率公式:
P ( A ∣ S ) = ∣ A ∩ S ∣ ∣ S ∣ = P ( A ∩ S ) P ( S ) P(A|S)=\dfrac{|A\cap S|}{|S|}=\dfrac{P(A \cap S)}{P(S)} P(A∣S)=∣S∣∣A∩S∣=P(S)P(A∩S)
推出: P ( A S ) = P ( S ) P ( A ∣ S ) P(AS)=P(S)P(A|S) P(AS)=P(S)P(A∣S)
P ( a , b ∣ c ) = P ( a , b , c ) P ( c ) = P ( a , b , c ) P ( b , c ) ⋅ P ( b , c ) P ( c ) = P ( a ∣ b , c ) P ( b ∣ c ) o r = P ( b ∣ a , c ) P ( a ∣ c ) \begin{aligned} P(a,b|c) &= \frac{P(a,b,c)}{P(c)}=\frac{P(a,b,c)}{P(b,c)}\cdot \frac{P(b,c)}{P(c)} \\ &= P(a|b,c)P(b|c)\qquad or\\ &= P(b|a,c)P(a|c) \end{aligned} P(a,b∣c)=P(c)P(a,b,c)=P(b,c)P(a,b,c)⋅P(c)P(b,c)=P(a∣b,c)P(b∣c)or=P(b∣a,c)P(a∣c)
全概率公式:
样本空间被划分为 B B B和 B ‾ \overline B B,
P ( A ) = P ( A B ) + P ( A B ‾ ) = P ( B ) P ( A ∣ B ) + P ( B ‾ ) P ( A ∣ B ‾ ) P(A) = P(AB)+P(A\overline B) = P(B)P(A|B) + P(\overline B)P(A|\overline B) P(A)=P(AB)+P(AB)=P(B)P(A∣B)+P(B)P(A∣B)
设 B 1 , B 2 , . . . B n B_1,B_2,...B_n B1,B2,...Bn为样本空间S的一个划分(完备事件组),且 P ( B i ) > 0 ( i = 1 , 2 , . . . , n ) P(B_i)>0\,(i=1,2,...,n) P(Bi)>0(i=1,2,...,n),则
对任一事件A,有: P ( A ) = ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(A) = \sum\limits_{i=1}^n P(B_i)P(A|B_i) P(A)=i=1∑nP(Bi)P(A∣Bi)
由条件概率公式:P(AB)=P(A)P(B|A)=P(B)P(A|B) 推出贝叶斯公式如下:
P ( B ∣ A ) = P ( A ∣ B ) P ( B ) P ( A ) P(B|A)=\dfrac{P(A|B)P(B)}{P(A)} P(B∣A)=P(A)P(A∣B)P(B)
分类器中:
P ( Y ∣ X ) = P ( X ∣ Y ) P ( Y ) P ( X ) P(Y|X)=\dfrac{P(X|Y)P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)P(Y)
P ( 类 别 ∣ 特 征 ) = P ( 特 征 ∣ 类 别 ) P ( 类 别 ) P ( 特 征 ) P(类别|特征)=\dfrac{P(特征|类别)P(类别)}{P(特征)} P(类别∣特征)=P(特征)P(特征∣类别)P(类别)
P(Y|X)随着P(Y)和P(X|Y)的增长而增长,随着P(X)的增长而减少,就是说
如果X独立于Y时被观察到的可能性越大,那么Y对X的支持度越小。
根据全概率公式,把 P ( A ) = ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(A) = \sum_{i=1}^n P(B_i)P(A|B_i) P(A)=∑i=1nP(Bi)P(A∣Bi)代入贝叶斯公式,
P ( B i ∣ A ) = P ( A ∣ B i ) P ( B i ) ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(B_i|A)=\dfrac{P(A|B_i)P(B_i)}{\sum_{i=1}^n P(B_i)P(A|B_i)} P(Bi∣A)=∑i=1nP(Bi)P(A∣Bi)P(A∣Bi)P(Bi)
其中, B 1 , B 2 , . . . B n B_1,B_2,...B_n B1,B2,...Bn为完备事件组,它们之间相互独立。
在事件A已经发生的情况下,贝叶斯公式可以用来寻找导致A发生的各种因素 B i B_i Bi的概率(倒果为因,把发生事件作为X,导致原因作为Y)。
假设邮件的内容中包含的词汇为Wi,垃圾邮件Spam,正常邮件ham。 判断一份邮件,内容包含的词汇为Wi,判断该邮件是否是垃圾邮件,即计算P(S|Wi)这个条件概率。
定义
当拿到一堆邮件并且已知哪些是垃圾邮件后,P(S)和P(H)可以直接得出,
对于邮件中包含的所有单词,统计每个单词出现在垃圾邮件中的次数,出现在正常邮件的次数,那么 P ( W i ∣ Y = S ) P(W_i|Y=S) P(Wi∣Y=S)和 P ( W i ∣ Y = H ) P(W_i|Y=H) P(Wi∣Y=H)也就有了,要求的是 P ( S ∣ W i ) P(S|W_i) P(S∣Wi)。
根据贝叶斯定理:
P ( S ∣ W ) = P ( W ∣ S ) ⋅ P ( S ) P ( W ∣ S ) P ( S ) + P ( W ∣ H ) P ( H ) P(S|W)=\dfrac{P(W|S)\cdot P(S)}{P(W|S)P(S)+P(W|H)P(H)} P(S∣W)=P(W∣S)P(S)+P(W∣H)P(H)P(W∣S)⋅P(S)
就得到了判断一个单词是垃圾邮件的概率。
我们分别计算出P(H|W)和P(S|W),比较它们的大小,就能判断是垃圾邮件还是正常邮件。
由于P(H|W)和P(H|S)的分母是相同的,我们只需要计算和比较分子即可。
考虑准确率和召回率:
https://blog.csdn.net/Gane_Cheng/article/details/53219332
一封邮件是由很多个词构成的,假设每个词是相互独立的,那么这些单词W1,W2,Wn同时出现的情况下,
这封邮件是垃圾邮件的概率:
P ( S ∣ W 1 , … W n ) = P ( W 1 , … W n ∣ S ) P ( S ) P ( W 1 , … W n ) = P ( W 1 ∣ S ) P ( W 2 ∣ S ) … P ( W n − 1 ∣ S ) P ( W n ∣ S ) P ( S ) P ( W 1 ) P ( W 2 ) … P ( W n − 1 ) P ( W n ) P(S|W_1,…W_n)=\dfrac{P(W_1,…W_n|S)P(S)}{P(W_1,…W_n)}=\dfrac{P(W_1|S)P(W_2|S)…P(W_{n-1}|S)P(W_n|S)P(S)}{P(W_1)P(W_2)…P(W_{n-1})P(W_n)} P(S∣W1,…Wn)=P(W1,…Wn)P(W1,…Wn∣S)P(S)=P(W1)P(W2)…P(Wn−1)P(Wn)P(W1∣S)P(W2∣S)…P(Wn−1∣S)P(Wn∣S)P(S)
或者:
P ( S ∣ W 1 , . . . , W n ) = P ( W i , . . . , W n ∣ S ) P ( S ) P ( W i , . . . , W n ∣ S ) P ( S ) + P ( W i , . . . , W n ∣ H ) P ( H ) = P ( W 1 ∣ S ) . . . P ( W n ∣ S ) P ( S ) P ( W 1 ∣ S ) . . . P ( W n ∣ S ) P ( S ) + P ( W 1 ∣ H ) . . . P ( W n ∣ H ) P ( H ) \begin{aligned} P(S|W_1, ... , W_n) &= \frac{P(W_i, ... , W_n|S)P(S)}{P(W_i, ... , W_n|S)P(S) + P(W_i, ... , W_n|H)P(H)} \\ &= \frac{P(W_1|S)...P(W_n|S)P(S)}{P(W_1|S)...P(W_n|S)P(S) + P(W_1|H)...P(W_n|H)P(H)} \end{aligned} P(S∣W1,...,Wn)=P(Wi,...,Wn∣S)P(S)+P(Wi,...,Wn∣H)P(H)P(Wi,...,Wn∣S)P(S)=P(W1∣S)...P(Wn∣S)P(S)+P(W1∣H)...P(Wn∣H)P(H)P(W1∣S)...P(Wn∣S)P(S)
P ( S ∣ W 1 , … W n ) P(S|W_1,…W_n) P(S∣W1,…Wn)求出之后,就得到一个概率,我们可以自己设置一个阈值,比如说概率大于95%时,认为此邮件为垃圾邮件。
拦截垃圾邮件要在保证准确率的前提下,提高召回率。邮箱服务非常重要,规定邮件是垃圾邮件的概率大于99.9%以上才能定为垃圾邮件进行拦截。在这个前提下,过滤关键词时的阈值 P ( S ′ ∣ W 1 , … W n ) P(S'|W_1,…W_n) P(S′∣W1,…Wn)进行变动时,计算召回率和准确率的变动,取准确率满足>99.9%时,召回率最高的过滤阈值。
计算过程存在的问题:
当词汇不存在时,即ni=0,此时Pr(S|Wi) = 0,会造成P=0,无法比较;
解决:将所有词汇初始化出现的次数为1,并将分母初始化为2
当P(S|Wi)较小时,连乘操作会造成下溢出问题;
解决:对概率取对数。
http://web.cecs.pdx.edu/~mm/MachineLearningWinter2010/BoostingNaiveBayes.pdf
http://pages.cs.wisc.edu/~dyer/cs540/handouts/elkan97boosting.pdf
我们在计算ps和ph联合后验概率时,可引入一个调整因子DS,其作用是调整词汇表中某一词汇的“垃圾程度”(spamicity),
ps = sum(testWordsMarkedArray * pWordsSpamicity * DS) + np.log(pSpam)
其中DS通过Adaboost算法迭代获取最佳值。原理如下:
设定adaboost循环的次数count
交叉验证随机选择1000个样本
DS初始化为和词汇列表大小相等的全一向量
迭代循环count次:
设定最小分类错误率为inf
对于每一个样本:
在当前DS下对样本分类
如果分类出错:
计算出错的程度,即比较ps和ph的相差alpha
如果样本原本是spam,错分成ham:
DS[样本包含的词汇] = np.abs(DS[样本包含的词汇] - np.exp(alpha) / DS[样本包含的词汇])
如果样本原本是ham,错分成spam:
DS[样本包含的词汇] = DS[样本包含的词汇] + np.exp(alpha) / DS[样本包含的词汇]
计算错误率
保存最小的错误率和此时的词汇列表、P(Wi|S)和P(Wi|H)、DS等信息,即保存训练好的最佳模型的信息
优点:
缺点:
Ref:
https://github.com/MarsPain/NaiveBayesSpamFilter
http://blog.lisp4fun.com/2018/03/09/bayes
https://blog.csdn.net/Gane_Cheng/article/details/53219332
https://www.cnblogs.com/huangyc/p/10327209.html
https://blog.csdn.net/aGreySky/article/details/100745680