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

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

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

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

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

## 新規ネットワークの構築

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

図 2: ネットワーク・ウィンドウは，ツールバー，表パネル，ネットワーク・パネルからなる．

## ノードの追加

最初に Sickノードを追加する．下記の手順で行う:

- "unnamed1" ネットワーク・ウィンドウのツールバーで，離散確率ツールを選択する（図3）．
- ネットワーク・パネル（図2）のどこかをクリックする．

ネットワーク・パネルをクリックすると，"C1" とラベルづけされたノードが現れる．このラベルを "Sick"に変更するには:

- マウス・カーソルでそのノードを選択する.
- ノードのプロパティ・ツール（図3）を押して， "ノードのプロパティ" を入力する．
- "名前"フィールドと "ラベル" フィールドの両方を"Sick"に変更する．
- "OK" ボタンを押す．

"名前"はノードの内部的な名前であり，一方，"ラベルl" はノードのラベルである． ラベルが指定されていない場合（ラベルを変更する前の場合のこと）は，そのラベルには内部名が使用される．内部名には半角英数字 'a'-'z' ，'A'-'Z'， '0'-'9'とアンダーバー '_'のみが使用できる．ラベルには，ほとんどの文字が使用できる．

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

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

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

## リンクの追加

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

- リンク・ツール（図3）を押す．
- SHIFT キーを押しながら左のマウス・ボタンでSick から Losesにリンクをドラッグする．SHIFT キーを押していれば，リンク・ツールを再び押さなくても，続けてリンクを追加できる．
- 左のマウス・ボタンでDry から Loses へリンクをドラッグする．

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

## ステート

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

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

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

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

- ノードSick の内側にカーソルを置いて左マウス・ボタンで選択する．その結果，図5のように，Sick のCPTが表パネルに表示される．
- 表パネルのＣＰＴ中のテキスト"State 1" を含むフィールドをクリックする．
- フィールド内でテキスト "sick" をタイプして，ステートにこの名前を与える．
- ＣＰＴ中のテキスト "State 2" を含むフィールドをクリックする．
- フィールド内でテキスト "not" をタイプする．

そして， Dryでも同じことを行う．

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

- Losesの2つのステートに "yes" と "no"と名前をつける.

## 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).

まず，表パネルにＣＰＴを表示するため，3つすべてのノードを選択する（ショートカット: Ctrl+A）．次に， Sick ノード内で値を入力する:

- Sick="sick"を表現するフィールドをクリック．
- (表 1から)値0.1を入力する.
- Sick="not"を表現するフィールドをクリックする．
- (表 1から)値0.9を入力する.

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

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

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

- "ファイル" メニューから"保存" (または "名前をつけて保存")を選択する．
- 名前を入力する（たとえば， "apple"）．
- "保存"を押す．

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

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

- ツールバーの実行モード・ボタン（図7）を押す．

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

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

- 巡回. ネットワーク中に有向巡回があってはならない．
- あるノードの各親コンフィギュレーションについて，さまざまなステートの確率の合計は1にならなければならない．言い換えると，表の各列の合計は1になる．合計が1にならない列がある場合，コンパイラは値を正規化する．このことは，確率を記入するときに活用できる．たとえば，病気のある木の確率が，1シーズンで13527本の木の観察に基づいていて，1678本には病気がり，残りは病気がないとしよう．最初から割合を計算する代わりに，我々は，ただSickノードのsickステートに1678を入れ，noステートに11849を入れるだけでよい．そして，コンパイラが適切な値を計算する．

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

## ネットワークの実行

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

図 8: 実行モードでのネットワーク・ウィンドウ．左側がノードリスト・パネル（Loses と Sick が開かれている）で，右側がネットワーク・パネル

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

## その木は病気であるか?

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

- すべてのノードを開く（ノードリストを開くを押す）．
- Loses ノードのステート"yes"をダブルクリックして，木が葉をなくしているという事実を入力する．
- ツールバーのSUM伝播ツール（図９）を押して，エビデンスの断片を伝播させる．
- ステート"sick"中にあるSick の確率を読む．

図 9: Sum 伝播ツール

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

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

木が病気である確率は，ここでは 0.49である．

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

## モニタ・ウィンドウ

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

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

- 初期化ツールボタンを押す（SUM伝播ツールの左側）．

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

- Sick と Loses を選択する（同時により多くのノードを選択するにはSHIFT キーを押したままにする）．
- "表示" メニューから"モニタ・ウィンドウを表示" を選ぶ．

図 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")を計算するだけでよい．これは以下のように行われる ：

- ネットワークに 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である．

Back