ベイズの定理
ベイズ推定 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A
P(A) = 事象Aが発生する確率を、事前確率(prior probability)、
P(A|X) = 事象Xが発生した下で、事象Aが発生する条件付き確率を、事後確率(posterior probability)、
ベイズの定理 P(A|X) = P(X|A) P(A) / P(X)
スパムフィルタの場合はこんな感じ?
事象
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のトークンそれぞれの確率のリスト
こっちは後で考えよう