Location : Home > Languages > Perl > Package
Title : AI::Fuzzy
Toolbox Logo

名称

 AI::Fuzzy - ファジー論理の Perl への拡張


概要

use AI::Fuzzy;

my $f = new AI::Fuzzy::Axis;
my $l = new AI::Fuzzy::Label("toddler",      1, 1.5, 3.5);

$f->addlabel("baby",        -1,   1, 2.5);
$f->addlabel($l);
$f->addlabel("little kid",   2,   7,  12);
$f->addlabel("kid",          6,  10,  14);
$f->addlabel("teenager",    12,  16,  20);
$f->addlabel("young adult", 18,  27,  35);
$f->addlabel("adult",       25,  50,  75);
$f->addlabel("senior",      60,  80, 110);
$f->addlabel("relic",      100, 150, 200);


for (my $x = 0; $x<50; $x+=4) {
    print "$x years old => " . $f->labelvalue($x) . "\n";
}

$a = new AI::Fuzzy::Set( x1 => .3, x2 => .5, x3 => .8, x4 => 0, x5 => 1);
$b = new AI::Fuzzy::Set( x5 => .3, x6 => .5, x7 => .8, x8 => 0, x9 => 1);
print "a is: " . $a->as_string . "\n"; 
print "b is: " . $b->as_string . "\n"; 

print "a is equal to b" if ($a->equal($b));

my $c = $a->complement();
print "complement of a is: " . $c->as_string . "\n"; 

$c = $a->union($b);
print "a union b is: " . $c->as_string . "\n"; 

$c = $a->intersection($b);
print "a intersection b is: " . $c->as_string . "\n"; 

説明

 AI::Fuzzy は実際には3つのモジュール AI::Fuzzy::Axis と AI::Fuzzy::Label と AI::Fuzzy::Set から構成されている。

 ファジー集合(fuzzy set)はその要素が 部分的に 属すことができる数学的な集合のことである。例えば黒は「暗い色」の完全な要素であるが、部分的な灰色の影はその集合に部分的に属していると言えるし、レモン色は完全に属していないと言える。
 ファジー軸(fuzzy axis)はファジーラベル(fuzzy label)を保持し、あるラベルにどの程度まで属しているかによって区別し、最も適切なものを選択する。例えば華氏60度を「寒い」「涼しい」「暖かい」などに分類するようなものである。
 ファジーラベルは軸の特定の範囲を指定するものである。上の例では「寒い」「涼しい」「暖かい」はラベルの1種である。ファジーラベルはある離散値(crisp value)が「寒い」「涼しい」「暖かい」などにどの程度属するかを示す。

Fuzzy Sets

AI::Fuzzy:Set has these methods:

  $fs = new AI::Fuzzy::Set;

  # ここで Bob は問題なく背が高い。他はそれほどでもない。
  $fs_tall_people = new AI::Fuzzy::Set( Lester=>34, Bob=>100, Max=>86 );

  # $x は 86 になるべき
  $x = membership $fs_tall_people, "Max";

  # 要素のリストを昇順で取得
  @shortest_first = members $fs_tall_people;

complement, union, intersection
 典型的な関数のファジー集合バージョン。
equal
 2つの集合が完全に同じであれば true を返す。
as_string
 組(tuples)として集合を出力する。

$b = new AI::Fuzzy::Set( x5 => .3, x6 => .5, x7 => .8, x8 => 0, x9 => 1);
print "b is: " . $b->as_string . "\n"; 

は以下の出力を行う。

b is: x8/0, x5/0.3, x6/0.5, x7/0.8, x9/1

Fuzzy Labels

 Fuzzy::Label によるラベルは4つの属性を持っている。1つはラベル名(どんなスカラーでもよい)及び3つの値 low, mid, high である。直交座標平面を想定するならラベルで示されるものはある範囲を示す。グラフは下図のようになるだろう。

  |Y               * (mid, 1)
  |               /  \
  |             /    \
  |           /       \
  |         /          \
 -|-------*-------------*------- X
           (low,0)      (high,0)

 Y 値は 所与の X 値におけるラベルの適用度を示す。例えばオレンジがカラーホイール上で 0 度または 360 度であるなら、ラベルは中央点で 100% を示す。low 及び high ではラベルが適用されない点を指定する。
 ラベルはオーバーラップしてもよく中央点は必ずしも真ん中の値でなくともよい。そのため通常、中央点の前後で傾きが異なる。

$fl = new AI::FuzzyLabel;

$fl->addlabel( "hot", 77, 80, 100 );
$fx = new AI::Fuzzy::Label ( "cold", 0, 10, 200 );
  # 私が暑いと思う温度(もちろん華氏で)

if ( $fl->lessthan($fx) ) {
    print "the laws of nature have changed\n";
}

# 上記のように関数 lessthan, greaterthan, lessequal, greaterequal を使うか
# または  <, >, <= , >= を使う。

$a = $fl->applicability($label, $value);
  # $a は $value に $label を適用する度合い

Fuzzy Axis

 Fuzzy::Axis はラベルのハッシュを保持する。値がラベルの全部の幅に対してどのように適用されるかを見ることができる。グラフは下図のようになるだろう。

  |Y             * (mid, 1)
  |           /\/ \      /|
  |  /- -\   / /\  \    / |  
  | /     \-/ /  \   \ /  |  (some function on some range of x)
  | |        /    \   /\  ---*-|
 -|---------*-----------*------- X
           (low,0)      (high,0)

the Y value is still the applicability of the label for a given X value, but there are three labels on this Axis. A different X value may put your value into a new label.  Y 値は 所与の X 値におけるラベルの適用度を示す。しかしこの軸には3つのラベルがある。異なる X 値には新しいラベルは必要である。

$fl = new AI::Fuzzy::Axis;

$fl->addlabel($label);
    # AI::Fuzzy::Label ドキュメントにあるようにラベルを追加

$a = $fl->applicability($label, $value);
    # $a はどの $label を $value に付与するかを示す度合い

$l = $fl->label ("labelname");
    # "labelname" で指定されたラベルオブジェクトを返す。

$l = $fl->labelvalue ($value);
    # $value にラベルを充当する。

@l = $fl->labelvalue($value);
    # ラベルのリストと適用度を返す。

$s = new AI::Fuzzy::Set( $fl->label($value) );
    # 同じものだがオブジェクトではない。

@range = $fl->range();
    # 中央点でソートされたラベルのリスト
    # 例えば(("cold", "cool", "lukewarm", "warm", "hot")

著者

 原著作者:Michal Wallace, <sabren@manifestation.com>
 現メンテ者:Tom Scanlan, <tscanlan@openreach.com>


参考資料

 どっかに行ってくれ、ここには何もないぞ。


バグ

 バグについては Tom Scanlan <tscanlan@openreach.com> まで。

Toolbox Logo
Updated : 2007/05/22