bogofilter notes
naive貝葉斯
前提假設:郵件中出現的各個詞之間完全獨立、不相關。
【前提假設未必正確但此模型效果很好】
(貝葉斯公式)
上式左端理解為F1, F2,,,,Fn同時出現時, 屬于類別C的概率。
式中分子就是
根據前提假設F之間獨立,因此
p(Fi|C, Fj)理解為當Fj出現在類別C中時,Fi的條件概率
因此判別由單詞F1,,,Fn構成的待識別郵件屬于哪個類, 可以求使得上式最大的C即可
當只有兩類:垃圾郵件C1、正常郵件C2時,可以直接計算p(C1|F1,F2,,,Fn)與p(C2|F1,F2,,,Fn)
http://en.wikipedia.org/wiki/Naive_Bayes_classifier
?
在使用貝葉斯實現bogofilter中, 只需要求p(垃圾類|待識別郵件),
對應的,C就表示垃圾類別; p(C)就表示垃圾樣本數/總樣本數, p(Fi|C)表示第i個詞出現在垃圾郵件樣本中的概率。
如果計算得到的p很大,超過spam_cutoff就認為是垃圾郵件.
robinson-fisher算法改進
robinson-fisher算在在傳統na?ve bayes的基礎之上逐步做了如下幾點改進:
1 使用f(w)代替p(w):
p(w)表示w在垃圾郵件中出現的概率(就是p(Fi|C));使用fw代替pw。
pw = ((bad / badmsgs) / (bad / badmsgs + good / goodmsgs));
【
假設ham為10, spam為20;
w在ham中出現4, good;
w在spam中出現2,bad。
那么pw就是0.2
】
fw計算公式:
? ??(s * x) + (n * p(w))
f(w) = --------------------
??????? ? ? ? s + n?
s,x都是robinson系數robs,robx; n是w出現的總次數
#define ROBS??????? 0.0178? /* Robinson's s */
#define ROBX??????? 0.52??? /* Robinson's x */
這兩個值可以使用bogofilter根據我們的樣本庫來得到推薦值。
?
對應bogofilter的代碼如下:
//good表示w出現在ham中的次數,bad則為在spam中的次數??
uint n = good + bad;
fw = (robs * robx + n * pw) / (robs + n);
//src/score.c
?
2 robinson改進貝葉斯鏈的計算公式
貝葉斯鏈就是計算
C表示垃圾郵件類別; 當該值大于spam_cutoff時就認為是垃圾郵件
?
?
robinson改進
P = 1 - ((1-p1)*(1-p2)*...*(1-pn))^(1/n)???? [spamminess]
Q = 1 - (p1*p2*...*pn)^(1/n)???????????????? [non-spamminess]
S = (P - Q) / (P + Q)??????????????????????? [combined indicator]
用S代表待識別郵件屬于垃圾郵件的概率。(p1, p2, p3表示郵件中出現的單詞在垃圾郵件中的概率;實際bogofilter使用了第一個改進得到的fw代替pi)
?
((1-p1)*(1-p2)*...*(1-pn))^(1/n), (p1*p2*...*pn)^(1/n) 表示開n次方,稱作robinson geometric mean, robinson幾何均值
?
S介于[-1,1]之間,可做線性處理成S = ?(1 + (P - Q) / (P + Q))/2
3 fisher對P, Q,S的求法做了改進
如上P, Q, S的計算公式
改進之后的計算公式://src/score.c : get_spamicity
Fisher's method uses an inverse chi-squared function, prbx, to get the probability associated with -2 times the sum of the logs of f(w) with 2n degrees of freedom: P = prbx(-2 * sum(ln(1-f(w))), 2*n) Q = prbx(-2 * sum(ln(f(w))), 2*n) S = (1 + Q - P) / 2 ? ? Prbx, 就是函數gsl_cdf_chisq_Q(double x, double k), 計算k個符合標準正態分布的隨機變量之和x 的cummulative distribution(累積分布函數): 因此,prbx的作用就是下圖式中以第1個參數為橫坐標x, 第2個參數為k,得到其縱坐標 ? http://en.wikipedia.org/wiki/Chi-square_distribution http://linux.math.tifr.res.in/manuals/html/gsl-ref-html/gsl-ref_16.html ? code:(代碼中的prbf就是上文中的prbx) score.p_pr = prbf(-2.0 * score.p_ln, sp_df);???????? /* compute P */ score.q_pr = prbf(-2.0 * score.q_ln, ns_df);???????? /* compute Q */ score.spamicity = (1.0 + score.q_pr - score.p_pr) / 2.0; ? 【prbx作用同算術均值,幾何均值類似, 是一種更復雜的統計推斷方式:假設已有k個獨立、符合標準正態分布的隨機變量之和為x,推斷這k個隨機變量同時出現時這個標準正態分布函數的累積分布值,也就是屬于垃圾郵件的概率】 ? ? ? ?4 優點/比較
http://www.bgl.nu/bogofilter/BcrFisher.html ????????? 改進1,2????????????? 改進1,2,3???????? Na?ve bayes Robinson-geometric-mean? Robinson-Fisher? Bayes Chain Rule ?????????? ---????????????????? ----????????????? -------- ????????? /??????????????????? /????????????????? | ???????? /??????????????????? |?????????????????? | ??????? /???????????????????? |?????????????????? | ?????? /???? ?????????????????|?????????????????? | ????? /?????????????????????? |?????????????????? | ???? /?????????????????????? /??????????????????? | ? ---??????????????????? ----????????????? -------- 圖中值均介于[0,1]之間, 為1表示肯定是垃圾郵件,為0表示是正常郵件。 使用樣本對檢驗上述三個算法效果圖如上。 第一個圖中[0, 0.55]被識別為正常郵件, [0.45, 1]被識別為垃圾郵件, 存在交集, 甚至無法選擇合適的spam_cutoff 第三個圖中絕大部分值都是0或者1;if a mistake is made, the algorithm leaves almost no room to express doubt.【如果訓練樣本中存在無間道, 將對識別結果造成很大影響】 第二個圖【現有bogofilter按此實現】沒有第一、三的缺點。絕大多數spam得分接近1, 絕大多數ham得分接近0, [0.1, 0.9]之間為unsure,可以在其中選擇一個合適的閥值,spam_cutoff in [0.93, 0.98] ? ?
上圖是比較na?ve bayes(bcr, bayes chain rule),? 使用fw替代pw的na?ve bayes, 以及robinson-fisher的測試結果圖
?【使用robinson-fisher效果最好:
http://www.bgl.nu/bogofilter/BcrFisher.html
http://www.bogofilter.org/pipermail/bogofilter/2002-November/000699.html】
Bogofilter 現版本使用了robinson-fisher算法計算一封郵件屬于垃圾郵件的概率
?5 改進的理由/討論
1 fw代替pw: fw包含了background info。
Pw的含義是任意一封郵件包含單詞w時, 此封郵件是垃圾郵件的概率;
而fw是如下二項式分布的數學期望值:已知單詞w出現了n次,在已有垃圾郵件中出現的概率是pw;那么第n+1次出現這封郵件時垃圾郵件的概率是多少【這個就是所謂的fw結合了backgroud info; 因為每次出現w時只有兩種結果,垃圾郵件、非垃圾郵件; 且每次出現獨立不相關的,所以符合二項式分布; fw就是上述所求概率的期望】
http://www.linuxjournal.com/article/6467
?
2 使用P, Q, S代替bayes chain rules
Bayes chain rules把各個詞的出現看做是獨立的來計算這些詞同時出現時的垃圾概率【理想世界】
P, Q, S計算的是這些詞combined起來計算 probability。
?
bogofilter基本用法
訓練
bogofilter -B ../sample_mail/non_spam_test/* -n -o0.00,0.99 -k 64 -d ./wordlist
-B, 指明文件列表
-n, 表示為正常郵件
-ospam_cutoff[,hamcutoff]
-k, 指明BDB文件的大小
-d, 指明wordlist所在目錄
./wordlist下的BDB文件作為內容特征輸入; 訓練完畢后./wordlist下的文件同時會被更新
不需要指明-u參數, 上述語句本身就是增量式訓練;
?
bogofilter -B ../sample_mail/non_spam_test/* -Ns -o0.00,0.99 -k 64 -d ./wordlist
將已訓練過的、non_spam_test下的郵件, 作為垃圾郵件重新訓練。
-N, unregister non-spam
-s, register-spam
?
?
bogofilter中查看bdb文件:
bogoutil -d wordlist
?
?
bogofilter分類:
bogofilter –B path –v –ov1[,v2] –d wordlist ; 從該命令行中輸出分析結果
?
說明
two state ?-o0.99,0.00: 只分兩類, spam, ham
hamcutoff = 0 spamcutoff = 0.99, 得分大于0.99為垃圾郵件, 低于0.99為正常郵件
tristate? -o0.99,0.8: 分三類, spam, unsure, ham
hamcutoff = 0.8 spamcutoff = 0.99, 得分大于0.99為垃圾郵件, 低于0.8為正常郵件, (0.8, 0.99)之間判定為unsure
?
robx 對于新詞給的預定概率: 初始值為0.5,表示該詞出現在垃圾郵件中的概率是0.5
robs 低于該閥值的作為新詞對待
?
?
SP_ESF, effective size factor(ESF) from spam
NS_ESF, effective size factor(ESF) from nonspam
bogofilter中默認值均為1.0
?
垃圾郵件識別有兩種錯誤:
False negative(fn), 將垃圾郵件識別為非垃圾郵件;漏報
False positive(fp), 將非垃圾郵件識別為垃圾郵件; 誤報
bogotune 推薦參數
n=·ls nonspam | gawk {s = sprintf(“ %s –n %s”, s, $NF);}END{print s}·
Bogotune –C –d wordlist $n $s
?
?
在config file中需要指定ignore file, 包含停用詞、無關詞等
總結
以上是生活随笔為你收集整理的bogofilter notes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: perl regular express
- 下一篇: 正确的 send recv 行为