Naive Bayes Classifier : 多変数ベルヌーイモデル

ML4NL を読みながら、ナイーブベイズ分類器の実装をした。
bayes でも十分面倒な綴りなのに、Bernoulli は数倍難しい。

文書が与えられた時に、どのクラスに分類されるかという確率 P(c|d)
ベイズの定理
P(c|d) = \frac{P(c)P(d|c)}{P(d)}で表して、これを最大化するクラスcが欲しい。
P(d)はクラスに依存しないので最大化に寄与せず、ここではP(c)P(c|d)をど
うやって料理しようかという話になる。

文書 d の種類は膨大であり、P(d|c)最尤推定で求めるのが非現実的だという説明を理解するのに時間がかかったのは、基礎から正しく理解していないのだろう。入力文書に合致する文書はそう見つからないし、あったとしても信頼性が低い、という話で合ってるのかな。

この曲者のP(d|c)を計算するために、d について簡単なモデルを仮定する。

多変数ベルヌーイモデル

ボキャブラリ V がある時に、V 中の語が文書内で登場するか、しないかを考える。
それぞれの語は独立であると仮定する(ここら辺がナイーブ)。

多変数ベルヌーイ分布なので、P(d|c)

P(d|c)=\prod_{w \in V}p_{w,c}^{\delta_{w,d}}(1-p_{w,c})^{1-\delta_{w,d}}

となる。ボキャブラリVの語全てに対して、各語が文書内で出現するかチェックし、出現する場合はp_{w,c}を乗じていく。その結果が c が与えられたときの文書の生成確率となる。


文書群 D を学習データとして、対数尤度 logP(D) = \sum_{(d,c) \in D} logP(c)P(d|c)の最大化問題を解くと、直感に合う p_cp_{w,c} が得られる(省略)。

V の全ての語について計算するので、学習データでは、あるクラスには出現するが他のクラスには出現しない語も存在するだろう。出現しない語については、p_{w,c}がゼロになってしまう。そうすると、P(d|c)が常にゼロになる。

スムージングのためには、0 に近い値を取りにくいディリクレ分布を導入したりする。

Wikipedia のダンプデータを使って、多変数ベルヌーイモデルのナイーブベイズ分類器を実装してみたところ、分かち書きデータをつっこむだけでも、それっぽく動いていた。すごい。