実際のファジーロジック

ファジーロジックに関する標準記事は、通常2つのことを行います。



  1. 99%のケースで、この記事はファジーセットのコンテキストでのファジーロジックの使用、またはむしろファジー推論、さらに正確にはMamdaniアルゴリズムを扱っています。 この方法でのみファジーロジックを適用できるという印象を受けますが、そうではありません。
  2. ほとんどの場合、記事は数学言語で書かれています。 すばらしいですが、プログラマーは異なる表記法で異なる言語を使用します。 したがって、この記事は有用であると思われる人にとっては単純に理解できないことがわかります。


実用的な基準を基準とすると、ファジーロジックは20世紀の数学の最大の成果の1つであるため、これはすべて悲しいことです。 この記事では、このプログラミングツールがいかにシンプルで強力であることを示すことを試みます。これは、同じようにシンプルですが、通常の論理演算のシステムよりもはるかに強力です。



ファジーロジックに関する最も注目すべき事実は、それが主にロジックであることです。 数理論理学の初めから、論理関数は選言的または連言的な正規形で表現できることが知られています。これは命題計算を実装するために、3つの操作だけで十分であることを意味します:結合(&&)、選言(||)および否定(!)。 古典的な論理では、これらの各操作は真理値表によって与えられます:



  ab ||  ab && a!
 -------- -------- ----
 0 0 0 0 0 0 0 1
 0 1 1 0 1 0 1 0
 1 0 1 1 0 0
 1 1 1 1 1 1 


ファジーロジックでは、古典的なロジックとは異なり、 偽の値の代わりに、0から1までの無限のセットから任意の値を取る真理度が使用されます。 そのため、論理操作をテーブルで表すことはできなくなりました。 ファジーロジックでは、それらは関数によって設定されます。



選言と結合を実装するには、2つの方法があります。



  #Maximinアプローチ:
 ||  b => max(a、b)
 a && b => min(a、b)
 #比色アプローチ:
 ||  b => a + b-a * b
 a && b => a * b 


否定は独自の方法で設定されます(推測するのは難しくありません):



  !a => 1-a 


極端な場合-変数の値が排他的に1または0である場合-上記の関数は、古典的な論理演算の真理値表を与えることを確認するのは簡単です。 できた! これで、信じられないほどのパワー、シンプルさを備え、同時に極端な場合には古典的なロジックと完全に互換性のある拡張ロジックができました。 プログラマーが論理式を使用する場合、ファジー論理式を使用できますか? そうでもない。



事実、プログラミング言語のすべてのオペレーターは明確な条件を必要とするため、ある時点で、ファジーな真実から明確なトリガー基準を常に取得する必要があります。 これは量子世界で起こることと似ています:システムがシュレディンガー方程式に従って進化する限り、その量子状態は決定論的かつ連続的に変化しますが、システムに触れるとすぐに量子ジャンプが発生し、システムは離散状態。 ファジーロジックでは、これは非ファジー化と呼ばれます。 自然は単に量子状態を確率に変えてサイコロを振るだけですが、一般的に言えば、非ファジー化の方法は異なります。 このトピックは別の記事に基づいているため、このトピックについては詳しく説明しません。 問題のセマンティクスを考慮して、非ファジー化の方法を選択する必要があることだけに言及します。



たとえば、ファジーロジックを使用して障害物を回避するミサイル制御システムを想像してください。 ロケットが正確に上り坂を飛行し、制御システムが解を計算することを想像してください:右に飛ぶ-0.5、左に飛ぶ-0.5。 重心法による非ファジー化を使用する場合、制御システムは直進するコマンドを提供します。 ブーム! 明らかに、この場合、正しい決定は、サイコロを振って、50%の確率でコマンドを「左」または「右」にすることです。



最も単純なケースでは、真実の度合いに基づいて決定する必要がある場合、セット[0,1]を間隔に分割し、if-else-ifを使用できます。



ファジーロジックを使用してファジー基準で検索する場合、非ファジー化はまったく必要ない場合があります。 比較を行うと、探索空間の各要素の平等度の値が得られます。 最低限の平等度、それ以下では関心のない値を定義できます。 残りの要素については、平等の程度が関連し、降順で結果をソートし、ユーザーに正しい結果を決定させます。



例として、ファジィロジックを使用して、研究所で楽しんでいた問題を解決します。これは、画像内の漢字を見つけるタスクです。



私はすぐに、ユーザーが画面に描いた落書きを認識するという考えを拒否しました(それがPDA画面でした)。 代わりに、プログラムは、日本の書道のルールで定義された23の順序から特性のタイプを選択することを提案しました。 ストロークの種類を選択することにより、ユーザーはストロークが収まる長方形を描きました。 実際、ヒエログリフは-辞書に入力され、保存された-両方とも、タイプが定義された長方形のセットとして表されていました。



この表現で象形文字の等価性を判断する方法は? まず、明確なステートメントで基準を定式化します。



象形文字AとBは、Aの各特性に対してBに等しい特性があり、Bの各特性にAに等しい特性がある場合にのみ等しい。



象形文字には重複する特徴が含まれていないことを暗黙的に想定しています。つまり、ある特徴が別のキャラクターの特徴と一致する場合、同じキャラクターの他の特徴と一致することはできません。



特性の平等は次のように定義できます。



特徴は、それらが同じタイプで、長方形が同じ領域を占める場合にのみ等しくなります。



これらの2つの定義は、検索アルゴリズムを実装するのに十分なステートメントシステムを提供します。



まず、次のように行列E [n、n]を作成します。



  for iの1..n
   1.のj
     E [i、j] = A [i] == B [j]
  終わり
終わり
 #AとBは象形文字です。  A [i]とB [j]はその特性であり、演算子「==」はファジー等価性を計算します。
 #両方のキャラクターが同じ数の特性を持っていると仮定されます-n。 


次に、この行列を閉じてベクトルM [n]にします。



  for iの1..n
   M [i] = E.max_in_row(i)
終わり
 #max_in_rowメソッドは、マトリックス行の最大値を計算します。 


実際には、比色法は結合に対して小さすぎる値を与えるため、私はmaximinアプローチを使用します。 maxが選言であることを思い出すと、Aのi行目がBの最初の行、2番目または3番目などと等しいというステートメントを計算していることがわかります。 したがって、Mは特性Aと特性Bの間の一致のベクトルです。



次に、一致ベクトルを1つの値に変換する必要があります。これは2つの方法で実行できます。



  #あいまいな組み合わせ。
 e = M.min
 #または:
 e = M.sum / M.length#(要素の合計とベクトルの長さの比)。 


両方の方法は機能しますが、方法は異なり、2番目の方法は機能を明確に比較しても機能します。 どちらが正しいかは哲学的な質問です。



機能の比較についていくつかの言葉を言う必要があります。 定義によると、機能の等価性は、2つの条件の組み合わせです。タイプの等価性と長方形の等価性です。 一部のタイプの機能は非常に似ています。 入力すると、ユーザーは簡単にそれらを混同する可能性があるため、類似度テーブルを用意する価値があります。 長方形の平等の程度として、それらの交点の面積と長方形の大きい方の面積の比をとることができます。



一般に、ファジーロジックの範囲は非常に広範囲です。 どのアルゴリズムでも、どのルール体系でも、真実と虚偽をある程度の真実に置き換えてみてください。おそらく、このルール体系またはアルゴリズムは現実をより正確に反映するでしょう。 結局のところ、私たちは根本的にあいまいな世界に住んでいます。



All Articles