2012-08-25 89 views
5

我想我已經正確實施了大部分。有一部分與我混淆:樸素貝葉斯和零頻問題

零頻率問題: 當屬性值沒有出現在每個類值時,爲每個屬性值類組合(拉普拉斯估計器)加上1。

下面是我的一些客戶端代碼:

//Clasify 
string text = "Claim your free Macbook now!"; 
double posteriorProbSpam = classifier.Classify(text, "spam"); 
Console.WriteLine("-------------------------"); 
double posteriorProbHam = classifier.Classify(text, "ham"); 

現在說這個詞「免費」是存在於訓練數據的地方

//Training 
classifier.Train("ham", "Attention: Collect your Macbook from store."); 
*Lot more here* 
classifier.Train("spam", "Free macbook offer expiring."); 

但這個詞在類別我的訓練數據存在'垃圾郵件'只在'火腿'中沒有。所以當我去計算posteriorProbHam時,當我遇到'free'這個詞時我該怎麼做。

enter image description here

回答

5

還添加了一個。原因:樸素貝葉斯模型P("free" | spam)P("free" | ham)是完全獨立的,所以你想估計每個完全獨立的概率。您用於P("free" | spam)的拉普拉斯估計器爲(count("free" | spam) + 1)/count(spam); P("ham" | spam)是一樣的。

如果你考慮不添加一個的意思,那麼它就沒有意義了:在火腿上看一次「免費」會讓它看到垃圾郵件中的「免費」的可能性更小。

+0

謝謝。我剛剛編輯了包含我正在遵循的公式。因此,例如P(viagra |垃圾郵件),如果訓練數據在垃圾郵件類別中對viagra有0個計數,我應該只加1? –

+0

如果您想使用拉普拉斯平滑,請在分子和分母的*全部*中加一個,而不僅僅是零計數。因此,如果您有10個免費垃圾郵件,5個免費垃圾郵件,50個垃圾郵件總數,100個非垃圾郵件總數,您會估計'P(免費垃圾郵件)=(10 + 1)/(50 + 1)' ,「P(垃圾郵件)=(50 + 1)/(150 + 1)」,「P(免費)=(15 + 1)/(150 + 1)」。您也可以使用小於1的數字(例如0.1,通常稱爲「alpha」,因爲它對應於使用[Dirichlet-alpha](http://en.wikipedia.org/wiki/Dirichlet_distribution)分佈作爲您的[prior ](http://en.wikipedia.org/wiki/Prior_probability)對這些概率。) – Dougal

+0

是的,這就是我最終做的。有些東西看起來不錯,但是其他人的概率大於1.看看上面的公式,這很容易取決於分母的結果。 –