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

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

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

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

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

図 2: 疾患問題のBN表現

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

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

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

### ノードの作成

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

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

#### 出力ノード

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

#### 入力ノード

また図３のネットワークでは， 時間相，すなわち 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: インタフェース・ノードの指定を含む疾患問題の単一タイムスライスのBN

## 疾患モデルの作成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- ノードのCPT中の親ステートの各コンフィギュレーションについて，ノードのさまざまなステートの確率の合計は１になるはずです．言いかえると，表の各列の合計は１にならなければなりません．もし合計が1にならない列があると，コンパイラは値を正規化します．このことは，確率を記入するときも活用できます．たとえば，最初のタイム・スライスでD1=Presentの確率が13527人の患者のオブザべーションに基づき，疾患を持つ人が168人観察されたとする．最初から分数を計算する代わりに，D1のPresentステートに168を入れて，Absenステートに13359を入れるだけで，コンパイラが適切な値を計算する．

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

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

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

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

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

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

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

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

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

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

Back