Huginの製品・サービスはマインドウエア総研により翻訳・提供されています。pict

ベイジアンネットワークの構築(続き)

BNのコンパイル

ネットをコンパイルし、どのように動くのか見てみましょう:

tool_compile

図 7: 実行モードのツールボタン

コンパイラは次のようなエラーをチェックします:

  • 循環。ネットワーク内に循環がないようにしなくてはならない(循環があるどうかは、矢印の方向に依存する)。
  • あるノードの親の各コンフィギュレーションに関して、個々のステートの確率の合計は1でなくてはならない。つまり、もし合計で1にならない列があるなら、コンパイラはその値を正規化する。このことは、ノードプロパティ中で入力するときに便利である。 たとえば仮に1678本が病気になり残りは病気にならなかったあるシーズンに、その病気になる木の確率が、13527本の木の観察をもとにしていたとする。最初端数を計算するかわりに、Sickノードのsickステートに1678、noステートに11849をを入力する. そうするとコンパイラは確率の適切な値を計算してくれる。

このチュートリアルのガイダンスに従っているのならば、コンパイルの過程でエラーはないはずです。このような小規模なBNだとコンパイルは非常に早く終了されるはずです。コンパイルの後、 "実行" モードに入ります(まだ"編集" モードでしか動かしていません)。

BNの実行

."実行"モードで実行する際、ネットワーク・ウィンドウは垂直な分離線で2つに分けられています(図 8)。左側がノードリスト・パネル、右側がネットワーク・パネルです。

show_test

図 8: "実行"モード内のネットワーク・ウィンドウ。 左にノードリスト・パネル( (LosesとSickを開いている状態)、右にネットワーク・パネル  

ノードリスト・パネルでノードを開くことによって、あるステート内にあるノードの確率を見ることができます。ノードリスト・パネルでダブルクリックしてノードを開きます(ノードリスト・パネルで小さいノードアイコンをクリックする場合は、クリックは一回だけ必要となります。LosesとSickを開いてみてください:

  • ノードリスト・パネルでLosesをダブルクリック
  • ノードリスト・パネルでSickをダブルクリック

ノード・プロパティツールのちょうど右にツールバーの中にあるノードリストを開くツールを押すと、一度にすべてのノードを開くことができます。

その木は病気なのか?

今、あなたは木が葉をなくしているという情報を与えられたリンゴの木が病気である確率を見つけるためにBNを使いたいとしましょう。次のように行います:

  • すべてのノードを開く(ノードリストを開くツールを押す)
  • Losesノードの"yes"ステートをダブルクリックして、木が葉を落としているという事実を入力する
  • ツールバーのsum 伝播(プロパゲーション)ツールを押し、Bbnを伝播する(図 9参照)
  • ステート"sick"にあるSickの確率を読み取る

tool_sum_prop

図 9: sum 伝播ツール

これによって、図 10のような出力が得られるはずです。

show_prop

図 10: 木の葉が落ちてしまったというエビデンスを入力し、sum 伝播した後のBN

木が病気である確率は今は 0.49です。

もし、上記のように指定された値を読めない場合は、おそらくCPT入力の際になにかミスタイプしています。そのときは、すべてのノードのCPTをチェックしてください。

モニター・ウィンドウ

.前の章では、エビデンスを入力したり、信念を読み出したりするのにノードリスト・パネルを使用しました。これをモニター・ウィンドウで行うこともできます。モニター・ウィンドウでは、ノードリスト・パネルと同じ情報を示しますが、ネットワーク・パネル内にあるBNのそれぞれノードの近くにモニター・ウィンドウを置くことができます。 ネットワーク・パネル内のノードそれぞれに対してモニター・ウィンドウを開くことができますが、それらを使用して一番役立つのは、おそらく特別に興味のあるBN内のノードに対してモニター・ウィンドウを開くときだけです。それ以外は、スペースを取り過ぎます。

SickとLosesに対してモニター・ウィンドウを開き、以前のような計算を繰り返しましょう。最初にBNを初期化します:

  • 初期化ツールボタンを押す(sum 伝播ツールの左にあります)

すると、 SickとLosesのモニター・ウィンドウを開く準備ができます。

  • SickとLosesを選択する(同時に何個ものノードを選択するときは、SHIFT キーを押したまま行います)
  • "表示"メニューから"モニター・ウィンドウを表示"を選ぶ

show_monitors

図 11: ネットワーク・パネルにSick と losesのモニター・ウィンドウが表示されている  

これでインフルエンス・ダイアグラムを使用するHugin知識ベースの構築方法を示す第2チュートリアル-インフルエンスダイアグラムの構築へと進むのに知っておく必要があることはすべて知っていることになります。この最初のチュートリアルの残りでは、Hugin GUIの非常に有用なところをいくつか紹介します。しかし、とばしてもかまいません。

最大尤度組み合わせ

前のセクションでの伝播から、干ばつに苦しむ木の確率は0.47であることがわかりました。SickとDryの両方のケースで、ステートが"not"である可能性が高い状態です。これで、ステートの最大尤度を持つ組み合わせは、SickとDryの両方がステート"not"を持つときあるということを信じさせることができました。しかしながら、これは間違った結論です。もし、すべてのノードでステートの最大尤度を持つ組み合わせを見つけたいのなら、(sum 伝播の代わりに)max 伝播を使用すべきです。max 伝播ツールはツールバーでsum 伝播ツールのちょうど右にあります。

max 伝播ツールを押してみましょう。それぞれのノードで、値100.00を持つステートは、最大尤度を持つステートの組み合わせに属しています。この場合では、この作業で、Sickが"sick"、Dryが"not"が最大尤度を持つ唯一の組み合わせであるとわかります。

たとえSick="sick"がSick="not"に比べて尤度が低くても、、Sick="sick"は、ノードのステートの最大尤度を持つ組み合わせの中に含まれます。 これは、伝播の結果からの結論に注意する必要があることを示します。

今、ある人が入力されたエビデンスが持つ仮説の元に、ステート(あるいはステートその他組み合わせ)の最大尤度組み合わせの確率を知りたがっているとします。.

ステートの組み合わせの確率の計算

:ここで、リンゴの木が葉をなくしているというエビデンスを与えられたステートの最大尤度組み合わせの確率を計算するテクニックを説明します。この確率は、以下にのように表現されます:

P(Sick="yes", Dry="not" | Loses="yes")

BNでsum 伝播を行うときはいつでも、入力されたエビデンスの確率はHUGIN Runtimeウィンドウの左下隅に示されています (P(All)値)。Losesノードの"yes"ステートを選択し、sum 伝播を行うと、Loses="yes"の確率 ( P(Loses="yes")と書かれる)を見ることができます。この値は0.1832のはずです。

このテクニックは、確率理論から次のようなルール (基本原則として知られているもの)を使用していま。:

P(A, B) = P(A | B) P(B)

:HUGINから得られる唯一の確率は、次の形式で書けるエビデンスの組の確率です。:

P(A1, A2,..., An)

求める確率をそのようなコンポーネントからなる数式で書き直すために基本ルールを使用します:

P(Sick="yes", Dry="not" | Loses="yes") = P(Sick="sick", Dry="not", Loses="yes") / P(Loses="yes")

基本ルールにおいて、両辺をP(B)で割ります。そして、我々はAをSick="yes", Dry="not"、BをLoses="yes"で置き換えます。

すでにP(Loses="yes")はわかっています。したがって、P(Sick="sick", Dry="not", Loses="yes")の計算だけが必要です。以下のように行います。:

  • BNでSick="sick"、Dry="not"、 Loses="yes"を入力します。
  • sum 伝播ツールを押します
  • 左下隅にあるP(All)値としてP(Sick="sick", Dry="not", Loses="yes")を 読みます

この値は、0.081となっているはずです。これで求める確率を計算する準備が整いました:

P(Sick="yes", Dry="not" | Loses="yes") = 0.081 / 0.1832 = 0.442

したがって、Loses="yes"が与えられたときの、SickとDryのステートで最大尤度を持つ組み合わせの確率は、0.442です。

これで最初のチュートリアルを終わります。もし、あなたが小規模のインフルエンスダイアグラムの構築方法を学習したい場合は、第2チュートリアルへ進むことをお薦めします。.