ベイズの定理

ベイズ推定 - Wikipedia
P(A) = 事象Aが発生する確率を、事前確率(prior probability)、
P(A|X) = 事象Xが発生した下で、事象Aが発生する条件付き確率を、事後確率(posterior probability)、
ベイズの定理 P(A|X) = P(X|A) P(A) / P(X)

http://ja.wikipedia.org/wiki/%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A

スパムフィルタの場合はこんな感じ?

事象
X:メールにFREE!と書いてあった
A:メールがスパムだった

確率
P(X) メールにFREE!と書いてある確率
P(A) メールがスパムである確率
P(X|A) メールがスパムであったときのFREE!と書いてある確率
P(A|X) メールにFREE!と書いてあったときのスパムである確率

A Plan for Spam

http://practical-scheme.net/trans/spam-j.html

について上記を当てはめてみる

wordが含まれるメールがspamである確率

(let ((g (* 2 (or (gethash word good) 0)))
      (b (or (gethash word bad) 0)))
   (unless (< (+ g b) 5)
     (max .01
          (min .99 (float (/ (min 1 (/ b nbad))
                             (+ (min 1 (/ g ngood))   
                                (min 1 (/ b nbad)))))))))

word:確率を計算する単語
goodとbad:各トークンがそれぞれの集合に現われた回数のハッシュテーブル
ngoodとnbad:それぞれspamでないメイルとspamメイルの総数
g:wordがgoodに現れた回数(2倍にしてバイアスをかけている)
b:wordがbadに現れた回数
全体で5回以上出現していない単語は計算から外している

b/nbad=wordがbadに現れた回数/スパムメールの総数=スパムメール1通あたりのwordが現れる平均回数≒P(word|spam)?
g/ngood + b/nbad=全メールで1通あたりwordが現れる平均回数≒P(word)?
P(spam)=0.5
P(spam|word) = P(word|spam) * P(spam) / P(word)
= b/nbad * 0.5 / (g/ngood + b/nbad)
あれ?lispのソースの方にはP(spam)が入ってない?これもバイアス?

結合確率

(let ((prod (apply #'* probs)))
  (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x))
                                     probs)))))

probs:15のトークンそれぞれの確率のリスト

こっちは後で考えよう