オブジェクト指向ベイジアンネットワークの構築法

このチュートリアルは,Huginグラフィカル・ユーザー・インタフェースで小規模なオブジェクト指向ネットワークを実装する方法を示す. 我々が構築しようとするネットワークは,オブジェクト指向のチュートリアルでの疾患の事例でモデルしたものである. 

我々のオブジェクト指向ネットワークの質的(構造)表現を図1に示す.このチュートリアルでは,CPTの指定の説明は割愛する.

図 1: 疾患問題を表現するオブジェクト指向ネットワーク

オブジェクト指向ネットワークの設計を理解するには,,オブジェクト指向のチュートリアルを参照せよ.このタイム・スライス.ネットワークをベイジアンネットワークとして構築すると,図2に示すネットワークが得られる.

図 2: 疾患問題のBN表現

 

タイム・スライス・モデルの作成

ネットワーク(すなわち,ベイジアンネットワークまたはインフルエンス・ダイアグラム)は,オブジェクト指向ネットワークの特別なケースである.ネットワークをオブジェクト指向にするものは,インスタンス・ノード(すなわち,他のネットワークのインスタンスを表すノード)の存在である.したがって,我々は”ファイル”メニューの”新規”メニュー項目を選んで,新しい空のネットワークを作成するところから開始する.これで,"unnamed<x>"と名付けられた空のネットワークを格納する新しいネットワーク・ウィンドウができます.ここで x は整数である.直ちにオブジェクト指向ネットワークの構築を開始できる編集モード が開始される(その他の主要なモードは,ネットワークの使用を可能にする実行モードである).

図2では,それぞれ4つのノード D1, D2, S1, S2を含む3つのタイム・スライスがあり, ここで D1 と D2 は ステート "Present"(あり) と"Absent"(なし)を持つ2つの異なる疾患を表し, S1 と S2 は各疾患の結果として観察されるであろう症状を表す.ここで S1とS2 が2つの可能な結果 "Observed"(観察される) および "Unobserved"(観察されない)によって症状を表現するとしよう.各タイム・スライスは,質的(構造)レベルと量的レベルの両方で同一(すなわちP(D1_2|D1_1), P(D2_2|D2_1)などの時間相を記述するそれらを含めてCPTは同一である)なので,我々は一般のタイム・スライスを記述するモデルのみを構築して,このネットワークの3つのインスタンスを接続する.

ノードの作成

まず,4つのノード D1, D2, S1, S2を含む一般タイム・スライス・モデルを構築する..ノードはすべて離散確率変数を表す.したがって, 離散確率ツールを選んで, (各ノードのツールが選択し直されるのを避けるために)シフト・キーを押しながらネットワーク・パネルの4つの異なる場所をマウスで左クリックして4つのノードを作成する.それから,ノードのデフォルト名を変更し, ノードのプロパティパネルを用いて,ノードのデフォルト名とそれらのデフォルト・ステートを変更する. 2番目に,リンク・ツールを選び,D1 の内側の点から S1 の内側の点にマウス・カーソルをドラッグ(すなわち,左マウス・ボタンを押して,ボタンを押したままマウス・カーソルを移動)して,マウス・ボタンを放し,D1からS1へのリンクを作成する.再び,シフト・キーを押しながら,同様な方法で他の3つのリンクを作成する.その結果は,図3に示される.

図 3: 疾患問題の単一タイム・スライスのBN

出力ノード

ここで,単一のタイム・スライスのネットワークが直前のネットワークに親ノードを持つようにするために,我々は図3のネットワークの外側のノードを参照できる必要がある.伝統的なBNでは,これは可能ではない.したがって, D1 と D2 がそれぞれ次のタイム・スライスで D1 と D2の親になろうとしているので, 我々はD1 と D2 を出力ノードとして宣言して,ネットワークの外側で(またはむしろネットワークのインスタンスによって)見えるようにしなければならない.

入力ノード

また図3のネットワークでは, 時間相,すなわち P(D1|D1 prev) および P(D2|D2 prev)のCPTを指定することができなければならない.ここでノード "D1 prev" と "D2 prev" は,それぞれ直前のタイム・スライスのD1 と D2のプレースホルダー(代理)ノードである.このようなプレースホルダー・ノードは,入力ノードと呼ばれ, 実際のノードと混同してはならない.入力ノードと一致するタイプの実ノードが,入力ノードに結合できます.つまり,入力ノードはそれに結合しているノードと同一になる.ただし,入力ノードがそれに関連する結合を得なかったとしても,その入力ノードを含む ネットワークはまだ使用できる(すなわち,ジャンクション・ツリーにコンパイルして推論に使用できる).その場合,入力ノードは実ノードとして取り扱われる.つまり,各入力ノードは,通常のノードと同様,それに関連するCPTを持つが,このCPTは,入力ノードが定義されているネットワークのインスタンスを格納しているネットワーク中の入力ノードに結合するノードがない場合のみ使用される.

入力ノードと出力ノードは,インタフェース・ノードと総称される.

インタフェース・ノードの作成

ここで,これをすべて実践に当てはめてみよう.まず, D1 と D2 を出力ノードとして宣言する. これは, それらのそれぞれの ノード・プロパティ パネル内の”出力”チェックボックスをクリックするとできる.それらの新しいステータスを出力ノードとして示すために,D1 と D2 はここで(ネットワーク・プロパティパネルでの設定で) インタフェース・ノード用に選択された色の細い境界線で描かれる.

2つの入力ノード "D1 prev" と "D2 prev"を作成するために,我々はまず2つの通常ノードを作成し,ノードのプロパティ・パネルで,それらの名前をそれぞれ, D1_prev とD2_prev (またそれらのラベルを "D1 prev" と "D2 prev")に設定する.また,これらの2つの新しいノードのそれぞれのノードのプロパティ・パネルで,それらを入力ノードとして宣言するために "入力" チェックボックスをクリックする. D1 と D2同様,"D1 prev" と "D2 prev" は,インタフェース・ノードの色の細い境界線で描かれる.さらに ,"D1 prev" と "D2 prev" の(通常の)境界線の外観は,それらが実ノードではないことを示す点線から実線に変わる.

最後に, "D1 prev" と "D2 prev" から D1 と D2へのリンクをそれぞれ作成する.これあの操作の結果を図4に示す.

図 4: インタフェース・ノードの指定を含む疾患問題の単一タイムスライスのBN

疾患モデルの作成

3つのタイム・スライスにまたがる最終の疾患モデルを作成するために,我々はまず(”ファイル”メニューの”新規”メニュー項目から)新しい空ネットワークを作成する.次に,インスタンス・ツールを選んで, シフト・キーを押しながらネットワーク・パネル中の3つの異なる場所を左クリックして3つのインスタンス・ノードを作成する. 結果は図5のようになる(81%に縮小).

図 5: ネットワーク・パネルは,図4に示すタイム・スライス・モデルを表現する3つのインスタンス・ノードを含む.

各インスタンス・ノードは,丸みがかった四角形で表示される.一般タイム・スライス・モデルでインスタンス・ノードとして宣言されたノードが,それぞれのインスタンス・ノードの中に現われることに注意せよ.入力ノードはインスタンス・ノードの上部の行に現れ,出力ノードはインスタンス・ノードの下部に現れる.

次に,インスタンスの出力ノード DiseasesSlice_1 と DiseasesSlice_2 をインスタンスの入力ノードto the input nodes of instances DiseasesSlice_2 と DiseasesSlice_3にそれぞれ結合させる必要がある.これは,出力ノードから対応する入力ノードに(リンク・ツールから)リンクを作成することによってできる. 結果のモデルを図6に示す.

図 6: インスタンスの出力ノードは,リンク・ツールを用いて,もう1つのインスタンスの入力ノードに結合される.

入力ノードの出現順序が逆の方が, 明らかに見かけがよくなるだろう.選択ツールを選ぶと,インタフェース・ノードの出現順序を簡単に変更できる.インタフェース・ノードの上部にマウス・カーソルを置いて左クリックすることにより,インタフェース・ノードを1つ左側に(シフト・キーを下げると右側に)移動する.並べ替え後のネットワークを図7に示す.

図 7: インスタンス・ノードの出現順序は,単純なマウス・クリックで変更できる.

最後に,重要でない詳細を隠すためにインタフェースい・ノードの1つないし複数を閉じて,ネットワークを整頓するのが望ましいことがよくある.我々は再び選択ツールを起動して,ノードの右外側でマウスを左クリックして,開いた(閉じた)インスタンス・ノードを閉じる(開く)ことができる.あるいは,その代わりに,”表示”メニューの”インスタンス・ノードを閉じる”(”インスタンス・ノードを開く”)を選んで,すべてのインスタンス・ノードを閉じる(開く)こともできる.

インスタンス・ノードを持つ図7のオブジェクト指向ネットワークは,図8のように閉じて表示される.

図 8: 閉じたインスタンス・ノードを持つ図7のオブジェクト指向ネットワーク.

オブジェクト指向ネットワークのコンパイル

ここで,図4のタイム・スライス・モデルのCPTが埋められていると仮定して(詳細は,BNのチュートリアルを参照),ネットワークをコンパイルして,それがどおように動作するかを見よう:

図 9: 実行モード・ツール・ボタン.

疾患ネットワークのような小規模なネットワークのコンパイルは,とても短時間でできる.コンパイルの後,実行モードに入る(我々はこれまで編集モードで作業していた).

オブジェクト指向ネットワークの実行

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

図 10: 実行モードのネットワーク・ウィンドウ.左側にノード・リスト・パネル(すべてのノードが閉じている),右側にネットワーク・パネル.

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

基本ノードとは異なり,インスタンス・ノードは,(サブ)ネットワーク全体を表現するので,それに関連した信念(確信度)モニタを持たない.その代わり,インスタンス・ノードが表現している(サブ)ネットワークのノードの一覧を見るには,インスタンス・ノードを開かなければならない(図11).

図 11: インスタンス・ノードを選択すると,インスタンス・ノードで表現されたネットワークのノードが,ノード・リスト・パネルに表示される.

インスタンス・ノードが多数のノードを含む場合,ノードリスト中の仮定されたノードの位置を見つけることが難しくなるかもしれない.このような場合,そのノード上を右クリック して”インスタンスをトラバース”を選択して(またはノードを選択して,ネットワーク・メニューの”インスタンスをトラバース”を選び),そのインスタンスを "トラバース(横断)" できる.これは,そのインスタンス・ノードが作成されたクラスのコンパイルされたバージョンでウィンドウを開く.このウィンドウでは,エビデンスを投入でき,あらゆる利用可能なインスタンスに 伝達できる.

インスタンスが多数のノードを含む場合,リストが散らかるのを防ぐために,すべてのプライベート・ノードを非表示にすることが可能である.これは,表示メニューの"プライベート・ノードをトグル" を選択して行える. 

実行モードの詳細は,BNの構築法チュートリアルを参照せよ.


Back

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