天天看點

樸素貝葉斯算法

我們來約定一下:

S: 郵件為垃圾郵件的機率

V: 郵件含有’viagra’詞的機率

貝葉斯會告訴我們已知這個郵件含有viagra詞,判斷為垃圾郵件的機率:

樸素貝葉斯算法

假設垃圾郵件和非垃圾郵件的機率都是0.5,即:

樸素貝葉斯算法

則通過上面的公式得到:

樸素貝葉斯算法

假設50%的垃圾郵件中有‘vargra’,隻有1%的非垃圾郵件中含有這個單詞,問這個郵件是垃圾郵件的機率:

樸素貝葉斯算法

可見,含有這個單詞一般都是垃圾郵件。

想象一下我們有一堆字母,

樸素貝葉斯算法

,我們使用Xi表示一封信中含有此詞的機率。同樣,

樸素貝葉斯算法

表示垃圾郵件中含有單詞的機率,

樸素貝葉斯算法

,非垃圾郵件中含有單詞的機率。貝葉斯估計最大的假設就是單詞存在之間沒有關系,也就是單詞都是獨立的,從數學的角度出發,也就是

樸素貝葉斯算法

,這是一個非常大膽的假設,雖然這是一種假設,但這種算法卻展現了很好的分類性能。接下來使用貝葉斯理論,則

樸素貝葉斯算法

,這時我們需要計算大量的機率乘積,不過我們可以用log函數來簡化,

樸素貝葉斯算法

。 

但有時候會存在除0的狀況,我們會使用一個因子k,得到

樸素貝葉斯算法

說完了理論,是不是感覺很空洞,那我們來實作一下吧。首先定義一個方法來得到不同的單詞作為集合。

我們第二個方法是統計訓練集中單詞的個數。傳回一個字典,key為單詞,value為二進制組(垃圾郵件的統計,非垃圾郵件的統計),來檢視某單詞在垃圾和非垃圾郵件中的個數。

我們下面一步就是計算機率了,傳回三元組,包含了每個單詞,在垃圾郵件中的機率和非垃圾郵件中的機率。

最後,我們通過這些單詞的機率和貝葉斯理論來計算是垃圾郵件的機率:

最後,我們寫成一個類:

我們來測試一下我們的分類性能。

樸素貝葉斯算法

下面我們就來測試一下:

這段代碼的含義就是将檔案夾下面的資料集放在一個data中。

分割成測試集和訓練集。

首先分類測試集中的資料,然後檢查準确率。在我的機器上,運作結果如下: 

樸素貝葉斯算法

精度為709/(709+28)=0.96,召回率為709/(709+40)=0/95,看起來還是蠻高的。我們有興趣看看哪些容易被誤分類。

最容易被判斷為垃圾郵件的非垃圾郵件和垃圾郵件最不容易被判斷的郵件。當然了,我們還最想看看垃圾郵件中的單詞。

我們列印出來單詞,如圖:

樸素貝葉斯算法

這些關于含有錢,工作等單詞的郵件很可能為垃圾郵件,而其他關于razor,等單詞卻不是,讓我們感到很吃驚。

繼續閱讀