概要
機械学習アルゴリズムを勉強するため、
『集合知プログラミング』(ISBN-13 : 978-4873113647)を読んだ際に、
プログラム内で出てくる式が何をしているのかがよく分からない部分があったので、
調べた内容をメモに残します。
ヘヴィな数学だったのでライトに読むなら追わなくてよかったかも...
久々に統計学を勉強しなおしたので、
間違いが多いかもしれません。ご指摘いただけると助かります。
6章ドキュメントフィルタリング
6.6.2 確率を統合する
- この節は、メールのスパム判定の大詰め
- キーワード(トークン)ごとに、スパムっぽいかの確率が求まっていること前提
- キーワードごとの確率から、フィッシャー法を用いて、ドキュメント全体で見た時にスパムかどうかを計算
アルゴリズム ⇒ 著者さんが githubで公開 してくれています。
個人的に分かりづらかったポイント(下記(1)
と(2)
と(3)
)のメモを残します。
def fisherprob(self,item,cat):
p=1
features=self.getfeatures(item)
for f in features:
p*=(self.weightedprob(f,cat,self.cprob))
# (1) ・・・ fscoreとは何を計算している?
fscore=-2*math.log(p)
return self.invchi2(fscore,len(features)*2)
# (2) ・・・ invchi2は何を計算している?
def invchi2(self,chi, df):
# (3) ・・・ 逆関数が計算できている?
m = chi / 2.0
sum = term = math.exp(-m)
for i in range(1, df//2):
term *= m / i
sum += term
return min(sum, 1.0)
-
(1)
fscore
とは何を計算している?-
fisher's method によると、
k
個の独立なp-value
(確率のようなもの)をかけて、log
をとって-2
をかけると、自由度2k
のχ二乗分布のp-value
が計算できるとのこと証明はまだ追えてないです-
p-value
については 統計手法のχ二乗検定 などをご参照ください - χ二乗分布の詳細はこちら
-
fisher's method によると、
-
(2)
invchi2
は何を計算している?- χ二乗分布の累積分布関数の逆関数
- χ二乗検定だと
p-value
を求めて、0.05
より小さい(χ二乗値が十分に高い)場合を基準として判断することが多いようですが、スパムの分類のテーマでは高いスコア=スパムとしたいので逆関数でχ二乗値(χ二乗分布に従う値)に戻している模様 - 引数
-
chi
・・・p-value
(0 ≦ chi ≦ 1
) -
df
・・・ χ二乗分布の自由度
-
- 出力
- χ二乗値(χ二乗分布に従う値)。ただし
1
を超えないようにしている。
- χ二乗値(χ二乗分布に従う値)。ただし
-
(3) 逆関数が計算できている?
- χ二乗分布の累積密度関数を見てもらうとわかる通り、逆関数が数式で出せないです
- 逆関数を計算するために、逆関数定理 を使って微分方程式に持ち込み、べき級数(n次方程式みたいなもの)を使って近似解を得るなどするようです。
- 累積分布関数の逆関数を精度良く計算す方法は日々研究されている様なので、精度のよい計算手法を採用したアルゴリズムで実装したんだと思われます。
-
Quantile Chi-Square
などのキーワードで論文を調べると様々な手法が検索できます -
Inverse Chi-Square
とすると、逆χ二乗分布 という似て非なるものがヒットするのでお勧めしません
-
関連情報メモ
- フィッシャー法は、日本語論文では Robinson-Fisher方式 と呼ばれている?
- フィッシャー法は、Robinson方式 から求められる