Location : Home > Languages > Perl > Package Title : AI::FuzzyInference |
![]() |
AI::FuzzyInference - ファジー推論システムの実装
use AI::FuzzyInference; my $s = new AI::FuzzyInference; $s->inVar('service', 0, 10, poor => [0, 0, 2, 1, 4, 0], good => [2, 0, 4, 1, 6, 0], excellent => [4, 0, 6, 1, 8, 0], amazing => [6, 0, 8, 1, 10, 0], ); $s->inVar('food', 0, 10, poor => [0, 0, 2, 1, 4, 0], good => [2, 0, 4, 1, 6, 0], excellent => [4, 0, 6, 1, 8, 0], amazing => [6, 0, 8, 1, 10, 0], ); $s->outVar('tip', 5, 30, poor => [5, 0, 10, 1, 15, 0], good => [10, 0, 15, 1, 20, 0], excellent => [15, 0, 20, 1, 25, 0], amazing => [20, 0, 25, 1, 30, 0], ); $s->addRule( 'service=poor & food=poor' => 'tip=poor', 'service=good & food=poor' => 'tip=poor', 'service=excellent & food=poor' => 'tip=good', 'service=amazing & food=poor' => 'tip=good', 'service=poor & food=good' => 'tip=poor', 'service=good & food=good' => 'tip=good', 'service=excellent & food=good' => 'tip=good', 'service=amazing & food=good' => 'tip=excellent', 'service=poor & food=excellent' => 'tip=good', 'service=good & food=excellent' => 'tip=excellent', 'service=excellent & food=excellent' => 'tip=excellent', 'service=amazing & food=excellent' => 'tip=amazing', 'service=poor & food=amazing' => 'tip=good', 'service=good & food=amazing' => 'tip=excellent', 'service=excellent & food=amazing' => 'tip=amazing', 'service=amazing & food=amazing' => 'tip=amazing', ); $s->compute(service => 2, food => 7);
本モジュールはファジー推論システムを実装している。端的に言えば、ファジー推論システムは入力変数と出力変数の間のファジー規則の集合を伴った入力と出力の集合で定義されるシステムである。
入力変数に対するクリスプな値が与えられればファジー推論システムはファジー規則を用いて各出力変数に対するクリスプな値を計算する。
ファジー推論の操作はファジー化(fuzzification)・推論(inference)・集計(aggregation)・非ファジー化(defuzzification)の4段階に分割できる。
Fuzzification
この段階では入力変数に対するクリスプ値が、項集合の各要素における入力変数のそれぞれに対するメンバーシップの度合いを計算する。これはファジー集合の集合を生成する。
Inference
この段階ではあらゆる定義された規則が確認される。各規則は2つの部分:条件部(precedent)と帰結部(consequent)から構成される。条件部の全ての部分を結合するためにファジー演算子(and, or)を適用することで各規則の支持の度合いを計算し、1つのクリスプな値を生成する。この値は規則の活性化の強さ(strength of firing)を示しており、規則の帰結部を再形成し、修正されたファジー集合を生成する。
Aggregation
活性化した規則に関係する全てのファジー集合はファジー演算子を通じて出力変数のそれぞれに対する1つのファジー集合を生成する。
Defuzzification
最後に、各出力変数に対する1つのクリスプな値を生成するために計算されたファジー集合に非ファジー化演算子が適用される。
ファジー推論に関する詳細な説明については Jerry Mendel によるチュートリアル http://sipi.usc.edu/~mendel/publications/FLS_Engr_Tutorial_Errata.pdf を参照のこと。
注意:本モジュールにおける用語は上記チュートリアルで用いられている用語とは異なる。
本モジュールには、以下のパブリックメソッドがある。
item new()
これはコンストラクタである。引数をとらず、初期化された AI::FuzzyInference オブジェクトを返す。
operation()
本メソッドはファジー演算子を設定/取得するために用いられる。少なくとも1つ、多くとも2つの引数をとる。最初の引数は質問における論理演算子を特定し、AND に対しては &、OR に対しては |、NOT に対しては ! が用いられる。2つめの引数は所与の演算子がどのメソッドに適用されるかを指定する。
以下の値が設定可能である。
メソッドは所与の演算で用いられたメソッドの名前を返す。
implication()
本メソッドは含意された出力ファジー集合の形状を変更するために用いたメソッドを設定/取得するために用いられる。
implication メソッドで用いる名称を特定する引数をオプションで指定することができる。
以下のものが指定可能である。
aggregation()
本メソッドは出力ファジー集合を結合するために用いたメソッドを設定/取得するために用いられる。
aggregation メソッドで用いる名称を特定する引数をオプションで指定することができる。
以下の1つだけが指定可能である。
defuzzification()
本メソッドは集計されたファジー集合から1つのクリスプな値を抽出するために非ファジー化処理を行う。
非ファジーメソッドで用いる名称を特定する引数をオプションで指定することができる。
以下の1つだけが指定可能である。
inVar()
本メソッドは議論の全体及び項集合に従って入力変数を定義する。ここに例を示す。
$obj->inVar('height', 5, 8, # 最小値, 最大値(フィートで) 'tall' => [5, 0, 5.5, 1, 6, 0], 'medium' => [5.5, 0, 6.5, 1, 7, 0], 'short' => [6.5, 0, 7, 1] );
この例では入力変数は height である。height のとることのできる値の最小値は 5 で、最大値は 8 である。関連して tall, medium, short の3つの項を定義している。これらの三角状の項集合の形状は提供された添え字の匿名配列で完全に特定される。
outVar()
本メソッドは議論の全体及び項集合に従って出力変数を定義する。引数は inVar() メソッドに対するものと同一でなければならない。
addRule()
本メソッドはファジー規則を追加するために用いられる。引数はハッシュ値の対で、キーは条件部、値は帰結部である。
各条件部は1つ以上の文字列の結合でなければならない。文字列はそれぞれ AND と OR を示す & または | で区切られていなければならない。各帰結部は1つの文字列でなければならない。各文字列は var = term_set という形式でなければならない。空白は完全にオプションである。
例は以下の通り。
$obj->addRule('height=short & weight=big' => 'diet = necessary', 'height=tall & weight=tiny' => 'diet = are_you_kidding_me');
最初の規則は基本的に「身長が低くて体重が大きければダイエットが必要である(If the height is short, and the weight is big, then diet is necessary)」ということを示している。
compute()
本メソッドは、キーが入力変数で値が変数の値であるようなハッシュ値の対を入力としてとる。ファジー推論規則を通じて走り、対応する出力変数の値を生成する。常に真値を返す。出力変数の実際の値を取得するには後述の value() メソッドを見よ。
例は以下の通り。
$obj->compute(x => 5, y => 24);
新しい計算を行う前には古い計算結果をクリアしてから compute() を呼び出すことに注意すること。これは後述の reset() メソッドを通じて行う。
value()
本メソッドは供給された出力変数の値を返す。(outVar() メソッドを用いて定義された)出力変数に対してのみ働き、compute() が実行されて呼び出された後の有効な結果を返す。
reset()
本メソッドは出力変数のクリスプ値を計算するために用いた全てのデータ構造をリセットする。上記の compute() メソッドにより黙示的に呼び出される。
純粋な Perl である。@INC で示される場所においておけばよい。
しかし気になるのなら伝統的な方法がある。
本モジュールをインストールするには以下のようにすればよい。
perl Makefile.PL make make test make install
Copyright 2002, Ala Qumsieh. All rights reserved.
本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。
バグ報告やコメントは aqumsieh@cpan.org まで。
![]() |
Updated : 2006/06/27 |