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

オブジェクト指向ベイジアンネットワークでの作業

By: Uffe Kjærulff

このチュートリアルは、HUGIN GUIで小さなオブジェクト指向ベイジアンネットワーク(OOBN)を実装する方法を示します。我々が構築するOOBNは、基本コンセプトの章の疾病の事例でモデルされたものです。他に2つのチュートリアルがあります:2つめのチュートリアルでは、基本コンセプトの章のリンゴの木の事例を構築する方法を示し、3つめのチュートリアルでは、この事例をインフルエンス・ダイアグラムに拡張します。

我々のOOBNの質的(または構造的)表現を図 1に示します。このチュートリアルでは、CPTの明細を無視します。

disease_prog_exp

図 1: 疾病問題のOOBN表現 

このOOBNの設計を理解するには、基本コンセプトの章を読んでください。我々は、このタイム・スライス・ネットワークをBNとして構築したら、図 2に示すネットワークを得るでしょう。

disease_prog_bn

図 2: 疾病問題のBN表現 

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

BNというのは、OOBNの特殊なケースです。ネットワークをOOBNとするものは、インスタンス・ノード(すなわち、他のネットワークのインスタンスを表現するノード)の存在です。したがって、我々は、"ファイル"メニューの"新規"項目を選んで、新規の空のネットワークを作成することから始めます。これは、"unnamed<x>"(ただし、xは整数)という空のネットワークを格納する新規のネットワーク・ウィンドウを提示します。 OOBNの構築を直ちに開始できる編集モードで開始します。(そのほかの主要なモードは、 OOBNを使用できる実行モードです。)

図 2において、4つのノードD1, D2, S1,S2を持つ3つのタイム・スライスのそれぞれを見ることができます。ここで、D1と D2は、 ステート "Present"(有) と "Absent"(無)による2つの異なる疾病を表し、S1と S2は、両方ともそれぞれの疾病の影響として観察されるであろう症状を表します。我々は、S1と S2が、2つの可能な結果"Observed" と "Unobserved"を持つ症状を表すと仮定しましょう。それぞれのタイム・スライスは、質的(または構造的)レベルでも量的レベルでもそっくりなので(すなわち、それらのCPTは時間相、すなわちP(D1_2|D1_1), P(D2_2|D2_1)などの記述を含めて同一)、我々は、総称タイム・スライスを記述するモデルの構築だけが必要で、そして、このネットワークの3つのインスタンスを結びます。

ノードの作成

まず、我々は4つのノードD1, D2, S1, S2を持つ総称タイム・スライス・モデルを構築します。これらのノードは、すべて離散確率変数を表します。したがって、我々は、離散確率ツールを選び、Shiftキーを押しながら(各ノードのツールを再選択することを避けるために)ネットワーク面で4つの異なる場所で左クリックして、4つのノードを作成します。それから、我々は、ノード・プロパティ・パネルを使って、ノードのデフォルト名とそれらのデフォルトのステート名を変更します。次に、Link Tool を選択して、D1の内側の点からS1の内側の点まで、マウス・カーソルをドラッグ(すなわち、左クリックしてボタンを押したままマウス・カーソルを移動)してD1から S1へのリンクを作成して、 そしてマウス・ボタンを放します・再び、Shiftキーを押しながら、同じ方法で他の3つのリンクを作成します。その結果が、図 3です。

disease_slice

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

出力ノード

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

入力ノード

また、図 3のネットワークにおいて、我々は時間相、すなわち、CPTs P(D1|D1 prev) および P(D2|D2 prev)を指定できるべきです(ただし、ノード"D1 prev" と "D2 prev" は、それぞれすぐ前のタイム・スライスでのD1 と D2の代替ノード)。このような代替ノードは入力モードと呼ばれ、実ノードと混同するべきではありません。 入力ノードと同一のタイプの実ノードは、その入力ノードに決定づけられます。すなわち、入力ノードは、それが制約するノードと同一タイプになります。ただし、入力ノードが関連づけられた制約を得なければ、その入力ノードを含むネットワークはまだ使われます(すなわち、ジャンクション・ツリーにコンパイルされて、推論に使われます)。その場合、その入力ノードは、実ノードとして取り扱われます。すなわち、各入力ノードは、通常のノードなので、それに関係したCPTを持ちますが、このCPTは、入力ノードが定義されたネットワークのインスタンスを含むネットワークの入力に制約されたノードがない場合だけ使用されます。.

I入力ノードと出力ノードは、ひとまとめにしてインタフェース・ノードと呼ばれます。

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

さて、実践に適用してみましょう。まず、D1と D2 を出力ノードとして宣言します。これはそれぞれのノード・プロパティ・パネルで "出力"のチェック・ボックスをクリックしてできます。そして、その新しいステータスを出力ノードとして指示するためにD1 と D2の色を(Network Properties面で設定したように)インタフェース・ノード用に選択された色に変更します。.

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"の境界の見かけが、solidから実ノードではないことを示す点線に変わります。

最後に、"D1 prev"と"D2 prev"からD1とD2へのリンクをそれぞれ作成します。,これらの操作の結果は、図 4のとおりです。

disease_slice_final

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

疾病モデルの作成

3つのタイム・スライスにまたがる最終的な疾病モデルを作成するには、まず新規の空ネットワークを作成します ("ファイル"メニューの"新規"メニュー項目から)。次に、インスタンス・ツールを選択して、Shiftキーを押しながらネットワーク・パネルで3つの異なる場所で左クリックして、3つのインスタンス・ノードを作成します(図 5参照)。

disease_prog_exp_nolinks

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

各インスタンス・ノードは、角の丸い四角形で現れます。総称時スライス・モデルでインタフェース・ノードとして宣言されたノードが、各インスタンス・ノード中に現れることに我々は気づきます。入力ノードは、インスタンス・ノードの最上部の行に現れ、同様に、出力ノードは、インスタンス・ノードの最下部に現れます。

次にインスタンスDiseasesSlice_1とDiseasesSlice_2の出力ノードを インスタンスDiseasesSlice_2とDiseasesSlice_3の入力ノードに、それぞれ結束する必要があります。これは、出力ノードから対応する入力ノードにリンクを作成(Link Toolから)することによってできます。結果のモデルは、図 6に示します。

disease_prog_exp_links

図 6: リンク・ツールを用いて別のインスタンスの入力ノードに結束さてれたインスタンスの出力ノード

明らかに、入力ノードが現れる順番が逆のほうが、モデルがよく見えます。 選択ツールを選ぶと、インタフェース・ノードの出現順序を簡単に変えることができます。インタフェース・ノードの上部にマウス・カーソルを置いて、左クリックすることにより、インターフェース・ノードを1つ左に(Shiftキーを押したら右)に移動します。順序変更後のネットワークを図 7に示します。

disease_prog_exp_reorder

図 7: インタフェース・ノードの出現順序は、1クリックで変更できる

最後に、無関係な詳細を隠すためにインタフェース・ノードの1つかそれ以上を閉じられることがしばしば望ましく、その結果、ネットワークの散らかりがよく抑えらます。再び、選択ツールを有効にして、ノードの外側で右クリックすることにより、開いた(閉じた)インターフェース・ノードを閉じる(開く)ことができます。 別の方法として、 "表示"メニューの"インスタンス・ノードを閉じる" ("インスタンス・ノードを開く")メニュー項目を選んで、すべてのインスタンス・ノードを閉じる(開く)こともできます。

図 8では図 7のOOBNのインスタンス・ノードが閉じられています。

disease_prog_col2

図 8: 閉じたインスタンス・ノードによる図 7のOOBN 

OOBNのコンパイル

さて、図 4のタイム・スライス・モデルのCPTが完成した(詳しくはBNのチュートリアルを参照)したら、ネットワークをコンパイルして、それがどのように動作するかを見ましょう:

  • ツールバーの実行モード・ツールボタンを押す(図 9参照)

tool_compile

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

  • ノードのCPT での親のステートの各設定について、ノードのさまざまなステートの確率は合計で1になるはずである。言い換えると、表の各列は、合計で1になるはずである。もし合計で1にならない列があれば、コンパイラーは値を正規化する。このことは、確率を入力するときに便利である。たとえば、最初のタイム・スライスのD1=Presentの確率が、13527件のオブザベーションに基づいて、168件の疾病が観察されたとする。端数を計算するのではなく、D1のPresentステートに168を、Absentステートに13359を入れるだけでよい。そして、コンパイラーが適切な値を計算する。

OOBNの実行

実行モードで、ネットワーク・ウィンドウが垂直バーで2つに分割される(図 10参照)。左にノード・リスト・パネル、右にネットワーク・パネル。

disease_prog_comp1

図 10: 実行モードのネットワーク・ウィンドウ。左は(すべてのノードが閉じられた)ノード・リスト・パネルで右はネットワーク・パネル  

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

.基本ノードとは違い、インスタンス・ノードは、全体(部分)のネットワークを表現するので、それらに関連づけられた信念モニタrを持ちません。その代わり、我々はインスタンス・ノードが表現する(部分)ネットワークのノードの一覧を見るために、インスタンス・ノードを開かなければなりません(図 11参照)。

disease_prog_comp2

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

実行モードの詳細については、BNのチュートリアルを参照してください。

3つめのチュートリアルを終わります。.