2016-01-29 51 views
0

我正在實現一個樸素貝葉斯垃圾郵件檢測器,其功能是單詞,我不確定是否理解正確的算法。使用樸素貝葉斯檢測垃圾郵件

這我如何我想實現的算法:

在訓練集我算從文本的特定詞的頻率存在於垃圾郵件文本,以及它存在於nonspam文本。我還會存儲在培訓期間檢查的垃圾郵件和非垃圾郵件的總數。

現在訓練完成後,假設我有一個新的文本T,我想分類。

予先假設爲垃圾郵件(S)和nonspam(N)的現有probabilites爲:

P(S) = 0.5 
P(N) = 0.5 

現在我檢查哪些被包含在T

每一個字W假設一個字W存在垃圾郵件文本爲20次,非垃圾郵件文本爲2次。垃圾郵件的檢查的總數爲50和非垃圾郵件的檢查的總數是50,以及,所以我有後probabilites:

P(W|S) = 20/50 
P(W|N) = 2/50 

計算的probabilites隨後將被

P(S|W) = P(W|S) * P(S) = 0.2 
P(N|W) = P(W|N) * P(N) = 0.02 

從這個算法會將文本分類爲垃圾郵件。

什麼我有麻煩理解的是以下情況:

假設我們有一個Word W這是一個垃圾郵件的文本出現0次,但1次在非垃圾郵件的文本。在這種情況下,垃圾郵件的後驗概率將爲

P(W|S) = O/50 = 0 

並且因此整個概率也將爲0。

因此,這意味着每當一個文本中出現一個從未在垃圾郵件文本中找到但在非垃圾郵件文本中找到的文本時,算法會將該文本分類爲非垃圾郵件,而不管其他任何其他詞事先概率。

這使我困惑,讓我覺得我還沒有正確理解算法。

回答

1

您必須實施疊加平滑處理,以考慮非字典單詞。

這種添加劑平滑會使一個字的不在字典P所屬的概率(W | S)> 0

這是可能性的修正公式:

P(word|class) = sum (I(word,D) + lambda)/|D_class| + lambda|V|) on each document D belonging to all documents in the class. 

其中I(word,document)是指示器功能,如果文檔包含該單詞則返回1,否則返回0

lambda被選定常數

|D_class|是在類

|V|文檔的數量是單詞在字典或數詞彙