ベイジアンネットワークの構築法

このチュートリアルは, Hugin グラフィカル・ユーザー・インタフェースでの小規模なベイジアンネットワークの構築の仕方を説明する.我々が実装しようとしているネットワークは,ベイジアンネットワークのチュートリアルのリンゴの木の事例でモデルしたものである. 

我々のネットワークの質的表現を図1に示す.

図 1: リンゴの木問題を表現するベイジアンネットワーク

このネットワークの設計を理解したい場合は,ベイジアンネットワークのチュートリアルを参照せよ.

新規ネットワークの構築

Hugin グラフィカル・ユーザー・インタフェースを起動すると,メインのHugin ウィンドウ(または単にメイン・ウィンドウ)が開かれる. このウィンドウは,メニューバー(メイン・ウィンドウ・メニューバーと呼ぶ),ツールバー(メイン・ウィンドウ・ツールバーと呼ぶ),ドキュメント・パネル(メイン・ウィンドウ・ドキュメント・パネル,または単にドキュメント・パネルと呼ぶ)を含む.ドキュメント・パネルでは,"unnamed1"と名付けられた新しい空のネットワークがネットワーク・ウィンドウ内に開かれる(図2). 直ちにネットワークの構築が開始できる編集モードを起動する(もう1つのメイン・モードは,ネットワークの使用ができる実行モードである).

  

図 3: 左から: 離散確率ツールノードのプロパティ・ツールリンク・ツール.

Dry ノードと Losesノードも,同様に追加する.SHIFTキーを押しながらネットワーク・パネル内をクリックしていくと,離散確率ツールを毎回押さなくても続けてノードを追加できる.ネットワーク・パネル内でノードを選んで,右クリックすると,ノードのプロパティ・ツールにアクセスできる.

図 4: ネットワークに追加された3つのノードSick, Dry, Losesを含むネットワーク・パネル

リンクの追加

そうすると,我々は図4のネットワーク・パネルに示すのと同じネットワークを持つこととなる.Sick から Loses および Dry から Losesへのリンクを追加するには,以下のように行う:

ここまでで,図1と同様の完成した質的表現になっているはずである.次のステップで,各ノードのステートと条件付き確率表(CPT)を指定する.

ステート

ベイジアンネットワークへの入門 で,ノードのステートを次のように指定した: Sick は "sick" と"not"の2つのステートを持つ. Dry は,"dry" と "not"の2つのステートを持つ,Loses は, "yes" と "no"の2つのステートを持つ.

まず,表パネル・ボタンをクリックして,表パネルを開く.   

図 5: 表パネルは,表パネル・ボタンをクリックして開かれ,選択されたノードのCPTが,そのパネルに表示される.

次に,Sickのステートを指定する:

そして, Dryでも同じことを行う.

Losesでもまったく同じことが行える.Loses の CPT は,Sick や Dryのそれよりも少し大きいことに留意せよ.これは,単に Loses が親ノード持つからである(Sick と Dry は持っていない).

CPT 値の入力

次のステップは, CPTの値を正確に入力することである (デフォルトとして,Huginグラフィカル・ユーザー・インタフェースは,すべてのノードに一様分布を与える). 値は,ベイジアンネットワークへの入門で指定されており,それらは表1, 2, 3に示すとおりである.

Sick="sick" Sick="not"
0.1 0.9
表 1: P(Sick).
Dry="dry" Dry="not"
0.1 0.9
表 2: P(Dry).
  Dry="dry" Dry="not"
Sick="sick" Sick="not" Sick="sick" Sick="not"
Loses="yes" 0.95 0.85 0.90 0.02
Loses="no" 0.05 0.15 0.10 0.98

表 3: P(Loses | Sick, Dry).

まず,表パネルにCPTを表示するため,3つすべてのノードを選択する(ショートカット: Ctrl+A).次に, Sick ノード内で値を入力する:

同様にしてDry とLoses についての値を入力する.CPT for LosesのCPTを入力すると,ネットワーク・ウィンドウは図6のようになる.

図 6: ノードLosesが選択されたネットワーク・ウィンドウ. LosesのCPTが表パネルに現れる..

これでネットワークの構築は完了する.この時点でネットワークを保存しておくことが得策である.その方法は:

ネットワークのコンパイル

さて,ネットワークをコンパイルして,それがどう動くかを見ていく:

図 7: 実行モード・ボタン

コンパイラは,以下のエラーをチェックする:

もしこのチュートリアルで説明したことを正確に行っているなら,コンパイル・プロセスでどんなエラーもないはずである.このような小さなネットワークのコンパイルは,とても早く終了する.コンパイルのあと,実行モードに入る(我々は,これまでのところ,編集モードでのみ作業をしてきた).t

ネットワークの実行

実行モードでの実行中,ネットワーク・ウィンドウは,垂直のバーで2つに分割される(図8).左側がノードリスト・パネルで,右側がネットワーク・パネルである.

図 8: 実行モードでのネットワーク・ウィンドウ.左側がノードリスト・パネル(LosesSick が開かれている)で,右側がネットワーク・パネル

ノードリスト・パネルでノードを開いて,特定のステートに存在するノードの確率を表示できる.ノードリスト・パネルの開く(閉じる)アイコンをクリックして,または,ノードリスト・パネルのノード・シンボルをダブルクリックして,または,ネットワーク・パネルでノードを選択(非選択)して,ノードを開く(閉じる)ことができる.ツールバー中のノードのプロパティ・ツールのちょっと右側のノードリストを開く(閉じる)を押して,一度にすべてのノードを開く(閉じる)こともできます.

その木は病気であるか?

ここで,木が葉をなくしているという情報を仮定して,リンゴの木に病気がある確率を発見するネットワークを使用したいと想像してみよう.これは,以下の手順で行われる:

図 9: Sum 伝播ツール

図10に示すアウトプットが得られるはである.

図 10: 木が葉をなくしているというエビデンスが入力されて伝播されたあとのネットワーク

.

木が病気である確率は,ここでは 0.49である.

上記の値が読めない場合は,CPTを記入するときに何かミスタイプした可能性がある.その場合,すべてのノードのCPTをチェックせよ.

モニタ・ウィンドウ

前の節では,エビデンスを入力し,信念(確信度)を回収するためにノードリスト・パネルを用いた.モニタ・ウィンドウを用いて,これを行うこともできる.モニタ・ウィンドウは,ノードリスト・パネルと同じ情報を表示するが,ネットワーク・パネル内の対応するネットワークのノードの近くにモニタ・ウィンドウを置くことができる.ネットワーク・パネル内で各ノードのモニタ・ウィンドウを開くことができるが,それらを使用する最も良い方法は,たぶん,特別に興味の対象となっているネットワーク中のノードのモニタ・ウィンドウのみを開くことである.さもないと,それらはたくさんのスペースをとることになる.

ここで,Sick と Loses のモニタ・ウィンドウを開いて,前の計算を繰り返してみよう.まず,ネットワークを初期化するt:

そして,Sick と Losesのモニタ・ウィンドウを開く準備ができた.

図 11: ネットワーク・パネルに表示されたSick とLoses のモニタ・ウィンドウ.

このチュートリアルの残りの部分は,Hugin グラフィカル・ユーザー・インタフェースのいくつかのとても便利な側面を紹介するが,読み飛ばしてもよい.

最も可能性の高い組み合わせ

前の節での伝播(プロパゲーション)から,リンゴの木が渇水に苦しんでいる確率が0.47であることがわかる, Sick とDry の両方の場合で、そのステートが "not"であることがより可能性が高そうである. これは,Sick と Dry のステート "not"であるときが,最も可能性の高いステートの組み合わせ(most likly combination)であると信じさせる. しかしながら,これは間違った結論である.もしすべてのノードでの最も高い可能性の組み合わせ(most likly combination)を発見したいなら,我々は(sum伝播ではなく)max伝播を用いるべきである. max伝播ツールは,ツールバーのsum伝播ツールのちょうど右側にある.

ここで,max伝播ツールを押してみよう.各ノードでは,値100.00 を持つステートが,最も可能性の高いステートの組み合わせに属する.このケースでは,Sick は "sick" でDry がは"not"が,最も可能性の高い唯一の組み合わせである.

Sick="sick" の可能性が Sick="not"より低くても,Sick="sick" がノードの最も可能性の高いステートの組み合わせを含んでおり,Sick="not" ではない,ということがわかる.このことは,伝播の結果からの結論づけには注意深くあることが必要であることを示している.

ここで,入力されたエビデンスを保持すると仮定して,この最も可能性の高いステートの組み合わせ(または他のステートの組み合わせ)の確率を知りたいだろう.

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

ここで,我々はリンゴの木が葉をなくしているというエビデンスを与えて,最も可能性の高いステートの組み合わせの確率を計算する技法を説明する.この確率は,次のように書かれる:

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

あるネットワークでsum伝播を実行するたびに,入力されたエビデンスの確率が,Hugin グラフィカル・ユーザー・インタフェースの左下部隅に表示される ( P(All) 値).Loses ノードで"yes" ステートを選んで,sum伝播を実行すると,Loses="yes" の確率( P(Loses="yes"と書かれる)を読むことでできる.この値は, 0.1832になっている.

この技法は,(fundamental ruleとして知られる)確率理論から以下のルールを使用する:

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

Hugin から得られる唯一の確率の種類は,次の形式で書かれるエビデンスの断片の系列の確率である

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

そのような成分で構成された式に,我々の要求された確率を書き換えるために,このfundamental ruleを使用する:

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

この fundamental ruleでは,我々は両側を P(B) で割った. したがって,我々は,A を Sick="yes", Dry="not" に B を Loses="yes" に置き換えた.

我々はすでに P(Loses="yes") を知っているので,我々は 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である.


Back

翻訳者:多田くにひろ(マインドウェア総研