1. 程式人生 > >樸素貝葉斯演算法----垃圾郵件識別

樸素貝葉斯演算法----垃圾郵件識別

問題是什麼?問題是,給定一封郵件,判定它是否屬於垃圾郵件。按照先例,我們還是用 D 來表示這封郵件,注意 D 由 N 個單片語成。我們用 h+ 來表示垃圾郵件,h- 表示正常郵件。問題可以形式化地描述為求:


P(h+|D) = P(h+) * P(D|h+) / P(D)


P(h-|D) = P(h-) * P(D|h-) / P(D)


其中 P(h+) 和 P(h-) 這兩個先驗概率都是很容易求出來的,只需要計算一個郵件庫裡面垃圾郵件和正常郵件的比例就行了。然而 P(D|h+) 卻不容易求,因為 D 裡面含有 N 個單詞 d1, d2, d3, .. ,所以P(D|h+) = P(d1,d2,..,dn|h+) 。我們又一次遇到了資料稀疏性,為什麼這麼說呢?P(d1,d2,..,dn|h+) 就是說在垃圾郵件當中出現跟我們目前這封郵件一模一樣的一封郵件的概率是多大!開玩笑,每封郵件都是不同的,世界上有無窮多封郵件。瞧,這就是資料稀疏性,因為可以肯定地說,你收集的訓練資料庫不管裡面含了多少封郵件,也不可能找出一封跟目前這封一模一樣的。結果呢?我們又該如何來計算 P(d1,d2,..,dn|h+) 呢?


我們將 P(d1,d2,..,dn|h+)  擴充套件為: P(d1|h+) * P(d2|d1, h+) * P(d3|d2,d1, h+) * .. 。熟悉這個式子嗎?這裡我們會使用一個更激進的假設,我們假設 di 與 di-1 是完全條件無關的,於是式子就簡化為 P(d1|h+) * P(d2|h+) * P(d3|h+) * .. 。這個就是所謂的條件獨立假設,也正是樸素貝葉斯方法的樸素之處。而計算 P(d1|h+) * P(d2|h+) * P(d3|h+) * .. 就太簡單了,只要統計 di 這個單詞在垃圾郵件中出現的頻率即可。關於貝葉斯垃圾郵件過濾更多的內容可以參考這個條目,注意其中提到的其他資料。


一點註記:這裡,為什麼有這個資料稀疏問題,還是因為統計學習方法工作在淺層面,世界上的單詞就算不再變多也是非常之多的,單詞之間組成的句子也是變化多端,更不用說一篇文章了,文章數目則是無窮的,所以在這個層面作統計,肯定要被資料稀疏性困擾。我們要注意,雖然句子和文章的數目是無限的,然而就拿郵件來說,如果我們只關心郵件中句子的語義(進而更高抽象層面的“意圖”(語義,意圖如何可計算地定義出來是一個人工智慧問題),在這個層面上可能性便大大縮減了,我們關心的抽象層面越高,可能性越小。單詞集合和句子的對應是多對一的,句子和語義的對應又是多對一的,語義和意圖的對應還是多對一的,這是個層級體系。神經科學的發現也表明大腦的皮層大致有一種層級結構,對應著越來越抽象的各個層面,至於如何具體實現一個可放在計算機內的大腦皮層,仍然是一個未解決問題,以上只是一個原則(principle)上的認識,只有當 computational 的 cortex 模型被建立起來了之後才可能將其放入電腦。