Location : Home > Languages > Perl > Package
Title : Algorithm::NaiveBayes
Toolbox Logo

名称

 Algorithm::NaiveBayes - ナイーブベイズアルゴリズム


概要

use Algorithm::NaiveBayes;
my $nb = Algorithm::NaiveBayes->new;

$nb->add_instance
  (attributes => {foo => 1, bar => 1, baz => 3},
   label => 'sports');

$nb->add_instance
  (attributes => {foo => 2, blurp => 1},
   label => ['sports', 'finance']);

# ... いくつかのインスタンスに対して繰り返した後
$nb->train;

# 未表示のインスタンスに対する結果を探索
my $result = $nb->predict
  (attributes => {bar => 3, blurp => 2});

説明

 本モジュールは古典的な「ナイーブベイズ」機械学習アルゴリズムを実装している。これは自動テキスト分類でよく用いられる、よく学習された確率的アルゴリズムである。. Compared to 他のアルゴリズム(kNN, SVM, Decision Trees)と比較して非常に高速で結果の質もそこそこ良い。
 Fabrizio Sebastiani の論文がテキスト分類のよい導入となるだろう。http://faure.iei.pi.cnr.it/~fabrizio/Publications/ACMCS02.pdf


メソッド

 

new()

 新しい Algorithm::NaiveBayes オブジェクトを生成してそれを返す。以下のパラメータが指定可能である。

add_instance( attributes => HASH, label => STRING|ARRAY )

 カテゴライザに学習インスタンスを追加する。attributes パラメータはキーが文字列属性で値がその属性の重みであるようなハッシュ参照を含む。例えばテキストドキュメントをカテゴライズするときに属性はドキュメント内の語であり、重みはその頻度とすることができる。
 label パラメータは1文字列か文字列の配列で、各文字列はこのインスタンスのラベルを示す。ラベルは任意の文字列でよい。ラベルを指定しないときは空の配列参照を渡す。

train()

 predict() メソッドを用いてカテゴライズする必要のある確率を計算する。

predict( attributes => HASH )

 本メソッドを用いて未知のインスタンスのラベルを予測する。属性は add_instance() も渡したものと同じフォーマットでなければならない。predict() はキーがラベル名で値がそのラベルに対するスコアであるようなハッシュ参照を返す。スコアは 0 と 1 の間の数値で、0 は本インスタンスに適用されないことを意味し、1 は適用されることを意味する。
 実際にはナイーブベイズで用いるスコアは 0 または 1 のごく近傍になることが多い。それは正規化が行われるからである。将来的にこの部分は緩和するかもしれない。

labels()

 Returns a list of オブジェクトが知るあらゆるラベルのリスト(順不同)を返す。スカラコンテキストで呼び出された場合はラベルの数を返す。

do_purge()

 学習インスタンス及びその関連情報を NaiveBayes オブジェクトから消去する。これは学習後のメモリ削減に役立つ。

purge()

 オブジェクトの purge プロパティの値に応じて true または false を返す。オプションでブール代数を引数として渡すとプロパティを設定する。


理論

 ベイズの定理は条件付確率の逆数である。つまり以下の式を意味する。

          P(y|x) P(x)
P(x|y) = -------------
             P(y)

 The notation P(x|y) は「所与の y が起こるという条件の下で x の起こる確率」を意味する。ベイズの定理に関する簡単だが完全な例は http://mathforum.org/dr.math/problems/battisfore.03.22.99.html を見よ。
 ここでは、ドキュメント内の所与のある語の列が所与のカテゴリ内にある確率を知りたいとすると以下のようになる。

                  P(words | cat) P(cat)
P(cat | words) = --------------------
                         P(words)

 P(cat | words) は直接計算することは困難であるが、P(words | cat) 及び P(cat) は計算できる(下を見よ)のでベイズの定理を使う。
 所与のドキュメントが所与のカテゴリに属する確率の我々は最大値が欲しい。それは次のように書ける。

                               P(words | cat) P(cat)
Best category =   ArgMax      -----------------------
                 cat in cats          P(words)

 P(words) はカテゴリの範囲によって変わらないのでこれを除外することができる。これは計算量の上からよいことであり、式は以下のようになる。

Best category =   ArgMax      P(words | cat) P(cat)
                 cat in cats

 最後に w1, w2, ... wn をドキュメント内の後だとすると式は以下に等しい。

Best category =   ArgMax      P(w1|cat)*P(w2|cat)*...*P(wn|cat)*P(cat)
                 cat in cats

 私のカテゴリ化コードの中で用いている式がまさにこれである。最後の段階は厳格ではなく、ナイーブベイズテクニックの「ナイーブ」な部分である。キュメント内で各語が出現する確率は他の言語の出現または非出現に影響されないと仮定している。これは真でないと知りながらそのように仮定している。例えば、語 "iodized" は、語 "subroutine" が含まれている文章の中よりもはるかに 語 "salt" が含まれているドキュメント内に多く見られるだろう。幸運にもこの仮定をはずしても結果はさほど変わらないという Pedro Domingos の議論が参考になる。http://www.cs.washington.edu/homes/pedrod/mlj97.ps.gz


履歴

 ナイーブベイズアルゴリズムの最初の実装は今は時代遅れの AI::Categorize モジュールの中であった。最初のリリースは2001年5月である。AI::Categorizer('r' が追加されたことに注意)における実装に置き換えた。この最初のリリースは2002年7月である。これを独自のモジュールとして独立させたものが今あなたが目にしているものである。


著者

 Ken Williams, ken@mathforum.org


著作権

 Copyright 2003-2004 Ken Williams. All rights reserved.

 本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。


参考資料

 AI::Categorizer(3), perl

Toolbox Logo
Updated : 2007/04/27