2012-08-25 3 views
5

私はそれを正しく実装したと思います。 1つの部分が混乱しました:Naive Bayesianとゼロ周波数問題

ゼロ周波数問題: すべてのクラス値で属性値が発生しない場合、すべての属性値 - クラスの組み合わせ(ラプラス推定子)の数に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を計算するために行くとき、私は単語 'フリー'に遭遇するときに何をするのですか?

enter image description here

答えて

5

さらに1つを追加します。理由:Naive Bayesは完全に独立しているとモデルP("free" | spam)P("free" | ham)をモデル化しているため、それぞれ完全に独立した確率を見積もる必要があります。 P("free" | spam)に使用しているラプラス見積もりは(count("free" | spam) + 1)/count(spam)です。 P("ham" | spam)は同じです。

ハムで「フリー」と表示されると、スパムに「フリー」と表示されにくくなります。

+0

ありがとうございました。私は次の式を含めるように編集しました。たとえば、P(viagra | Spam)のように、訓練データに「スパム」カテゴリのバイアグラの数が0の場合は、1を追加するだけです。 –

+0

ラプラシアンスムージングを使用する場合は、ゼロカウントだけでなく、分子と分母の* all *に1を加えます。したがって、あなたが10の無料のスパム、5つの無料の|スパム以外のスパム、50のスパム合計、100のスパム非スパム合計を持っていれば、 'P(フリー|スパム)=(10 + 1)/(50 + 1) P(スパム)=(50 + 1)/(150 + 1)、P(空き)=(15 + 1)/(150 + 1) [Dirichlet-alpha](http://en.wikipedia.org/wiki/Dirichlet_distribution)ディストリビューションを使用することに対応するため、1より小さい数字を使用することもできます(例:0.1、通常は "alpha"と呼ばれます)。 ](http://en.wikipedia.org/wiki/Prior_probability)これらの確率について。 – Dougal

+0

ええ、それは私がやったことです。状況はしばらく見えますが、他のものは1より大きい確率で終わります。上記の式を見ると分母の結果によって簡単に可能です。 –