Huginの開発環境は,ネットワークとインフルエンス・ダイアグラムを記述するために,Net言語と呼ぶ特定目的の言語を使用します.この言語は,ネットワーク・モデルの構造の指定,条件付き確率と効用関数,および(インフルエンスダイアグラムでの)決定の時間的順序などを含む,ベイジアンネットワークとインフルエンスダイアグラムの完全な記述を作成することを可能にします.
この章は,Net言語の第3改定版を説明します.この改訂版は,第1版から本質的に異なっており,第2版からも幾分異なります.その理由は,この言語の第1版は固定のフォーマット(すなわち,さまざまな要素の意味が,記述中のそれらの位置によって決定される)を使用していたことです. これは,古い言語での記述が新しい言語でもその意味が保持されるようにして言語を拡張することができないことを暗示しています.第2版は,その目的を意図して設計されました.第3版は,第2版の微修正を含み,オブジェクト指向ネットワークの指定を可能にしました(すなわち,netファイルがインスタンス・ノード,およびインタフェース・ノードを指定する方法を含むことができるようになりました)..
ネットワーク・モデルの基本要素はノードです.通常のベイジアンネットワークでは,ノードは確率変数(離散または連続)を表現します.通常のインフルエンス・ダイアグラム では,ノードは意思決定者にコントロールされる決定,または変数のさまざまなコンフィギュレーションにプリファレンスを割り当てるために使用する効用関数を表現します.オブジェクト指向ネットワークでは, インスタンス・ノードというノードのカテゴリがあって,他のネットワークのインスタンスを表現します.つまり,インスタンス・ノードは,ネットワーク中に現れるサブ・ネットワークを表します.
下記のノード記述は, "Chest Clinic(胸部クリニック)"
の事例 (Lauritzen
& Spiegelhalter 1988)からのものです.
node T
{
states = ("yes" "no");
label = "Has tuberculosis?";
position = (25 275);
}
これは,"yes" と"no"にラベルづけされたステートを持つT というバイナリ確率変数を記述します.この記述は,Hugin グラフィカル・ユーザー・インタフェースで使用されるラベルと位置も与えます. |
ノード記述は,次のキーワードのうちの1つによって導入されます:[<prefix>] node, decision, utility, または instance ,ここで,where the optional prefix on node でのオプショナル・プレフィックスは, discrete または continuous のいずれかです(プレフィックスを省略すると,デフォルトではdiscrete を使用します).キーワードは,モデル内で唯一の名前に続きます.さらにインスタンス・ノードでは,インスタンスである他のネットワーク(またはクラス)の名前と,インスタンス・ノードの入力ノードの結合に続きます.正確な文法は,次のとおりです.
instance <name> : <class> ({<input> = <node>}*)
ここで <class> は,<name> がインスタンスであるところのネットワークの名前で, {<input> = <node>}* は<input> = <node>のようなゼロ個またはそれ以上の要素のコンマ区切り一覧を表し, <input> は <class> 内の入力ノードの名前で, <node> は,ネットワーク内に表れているノードまたは,ネットワーク内に含まれるネットワークのインスタンスの出力ノードの名前です. <input> と <node> は,一貫したタイプ(種類)でなければならないことに注意してください.すなわち,同じカテゴリ,種類,サブ・タイプであり,それらが離散変数であれば,同じステート・ラベル/アたちを持ちます.
下記は,名前 Person_1を持つインスタンス・ノードを指定します. このノードは,Personというネットワークのインスタンスを表し,,
I および E というノードは,ネットワーク中で使用されるPersonのインスタンスのそれぞれIncome および Educationという入力ノードにつながっています.
instance Person_1 : Person (Income = I, Education = E)
{
label = "Bill Yates";
position = (101 156);
}
この記述は,Huginグラフィカル・ユーザー・インタフェースで使用されるラベルと位置も与えます. |
そして,すべての種類のノードで,括弧で閉じられた
<name> = <value>;
の形式の名前と値の対のシーケンスが続きます.
この事例は,ノードについてnet言語中で現在定義されているフィールド名を示します:states, label, および position.これらのフィールドのすべては,オプショナルです. いくつかのフィールドが不在の場合,デフォルト値が供給されます.
デフォルト値は,長さ1のリストで,空の文字列を格納しています(すなわち,ノードが1つのステートを持つ).
states フィールドは,効用ノードと連続確率ノードでは使用できません.
これらのフィールドは別として,ノードに対して独自のフィールドを指定することができます.これらは,ノードに関するその他の情報を必要とする特定のアプリケーションのために使用できます.
このシチュエーションでは,ノード T が特定アプリケーション用フィールド MY_APPL_my_fieldを割り当てています.
node T
{
states = ("yes" "no");
label = "Has tuberculosis?";
position = (25 275);
MY_APPL_my_field = "1000";
}
|
このような特定アプリケーション用フィールドの値は,引用文字 (")でくくられた文字列のみ可能です(文字列の正確な定義については "Lexical Matters" を参照).
混乱を避けるために特定アプリケーション用プレフィックス(事例3ではMY_APPL prefix)でフィールド名を開始するのがよい方法かもしれません.
Hugin グラフィカル・ユーザー・インタフェースのいくつかのエキストラ・フィールドは,ノードとそれらのステートの両方の説明を保存するのに使用されます.これらは,HRでプレフィックスされたフィールドです.
node T
{
states = ("yes" "no");
label = "Has tuberculosis?";
position = (25 275);
HR_State_0 = "Yes, the patient HAS tuberculosis.";
HR_State_1 = "No, the patient has NOT tuberculosis.";
HR_Desc = "Represents the fact that the patient has\
tuberculosis or not.";
}
|
構造(すなわち,グラフのエッジ)は,間接的に指定されます.有向エッジと無向エッジの2種類があります.
これは,有向エッジの典型的な指定です:
potential ( A | B C ) { }
これは,ノード A が2つの親, B と C を持つことを指定します.つまり,B からA に有向エッジがあり, C から A に有向エッジがあります. |
モデルは,無向エッジを含むこともできます.そのようなモデルをchain graph(チェーン・グラフ)モデルと呼びます..
potential ( A B | C D ) { }
これは, A と B の間に無向エッジがあることを指定します. さらに,例によって, A と B は, C と D を親として持つことを指定します. |
親がない場合は,垂直のバーは省略できます.
無向エッジで接続されたノードの最大集合をチェーン・グラフ・コンポーネントと呼びます.
すべてのグラフが許可されるとは限りません.ネットワークの構造において,以下の制限が強制されます.
グラフは,いかなる(有向)巡回も含みません.
下記の指定は,巡回
potential ( B | A ) { }
potential ( C | B ) { }
potential ( A | C ) { }
ただし,以下の指定は 適法です.
potential ( B | A ) { }
potential ( C | B ) { }
potential ( C | A ) { }
|
下記の指定は, 巡回
potential ( B | A ) { }
potential ( C | B ) { }
potential ( A C ) { }
ただし,以下の指定は 適法です.
potential ( A | B ) { }
potential ( C | B ) { }
potential ( A C ) { }
|
インフルエンス・ダイアグラムでは,連続確率ノードは使用できません.すなわち,効用ノードまたは決定ノードを含むネットでは,連続ノードは存在できません.
効用ノードは,グラフ中で子を持つことはできません.これは効用ノードが垂直バーの(右ではなく)左側にのみ現れることを暗示します.
無向エッジは,離散確率ノードの間にのみ可能です.
連続ノードは,連続ノードのみを子として持つことができます.
決定ノードが垂直バーの左側に現れる場合,単独で現われるはずです.この場合,いわゆる情報 リンクが指定されます;このようなリンクは,どの変数が既知で,いつ決定がなされるべきかを指定します.インフルエンス・ダイアグラムでは,すべての決定の全体的順序がなければならず,その順序はネットワーク構造に従います.すなわち,すべての決定を含む有向パスが存在するはずです.
2つの決定 D1 と D2 ,および3つの離散確率ノードA, B, C を持つインフルエンス・ダイアグラムを指定したいと仮定します.
まず,A
が観察されて;つぎに決定 D1 がなされ;次に B が観察されて,最後に決定 D2 がなされます.このイベントのシーケンスは,下記のように指定されます:
potential ( D1 | A) { }
potential ( D2 | D1 B ) { }
|
結局,node-, decision-,または utility-指定によって宣言されるまでは,どのようなpotential指定でも参照されるノードはありません.
我々は,モデルの量的パートを指定することも必要です.このパートは,確率変数の条件付き確率関数と効用関数が仮定できる値からなります.したがって,我々は,離散確率, 連続確率, 効用 ポテンシャルを区別します.
ポテンシャルのタイプによって,ポテンシャル指定の括弧の間の数値指定が異なります.
下記の記述は,"Chest Clinic(胸部クリニック)" の事例からのもので,離散変数 T の条件付き確率を指定します.
potential ( T | A )
{
data = (( 0.05 0.95 ) % A=yes
( 0.01 0.99 )); % A=no
}
これは,アジアへの旅行を仮定した場合の結核の確率が
potential ( T | A )
{
data = ( 0.05 0.95 % A=yes
0.01 0.99 ); % A=no
}
|
この事例が示すように,ポテンシャル指定の data フィールドで数値データが指定されます.このデータは実数のリストの形式を持ちます.リストの構造は,子ノードが続く親ノードからなるノード・リストによる多次元の表の構造であるか,または,まったく構造を持たないフラットなリストであるかのどちらかです.data リストの "レイアウト" は,row-major (行主体:"Row-major 表現"を参照)です.
potential ( D E F | A B C ) { }
このポテンシャル指定の data フィールドは,次元リスト <A, B, C, D, E, F> を伴う多次元表に対応します. |
効用ポテンシャルの data フィールドは,垂直バーの右側のノードの次元のみを持ちます.
以下の記述は, "Oil Wildcatter" の事例のもので,効用ポテンシャルを示します. Drillpay が効用ノードで,一方 Oil は3つのステートを持つ離散確率ノードで,Drill は2つのステートを持つ決定ノードです.
potential (Drillpay | Oil Drill)
{
data = (( -70 0 ) % dr
( 50 0 ) % wt
( 200 0 )); % sk
}
このポテンシャル指定のdata フィールドは,次元リスト < Oil, Drill>.を持つ多次元表に対応します. |
連続確率ポテンシャルの data フィールド内の表は,垂直バーの右に離散確率ノードの次元を持ちます.すべての離散確率ノードは,垂直バーの右側の最初に一覧されている(そして連続ノードが続く)はずです.ただし,多次元表内の項目は,もはや値ではなく,連続分布関数です.現在は,ガウス型正規分布のみが使用できます. 正規分布は,その平均と分散によって指定できます.下記の事例では,連続確率ポテンシャルが記述されています.
A が,離散である B と C を親として持つ連続ノードだと仮定します. また, B と C は,両方とも2つのステートを持ちます: B はステート b1
と b2 を,一方, C はステート c1 と c2 を持ちます.
potential (A | B C)
{
data = (( normal ( 0, 2 ) % b1 c1
normal ( 3, 2 ) ) % b1 c2
( normal ( 1, 2 ) % b2 c1
normal ( 2, 2 ) )); % b2 c2
}
このポテンシャル指定のdata フィールドは,次元リスト < B, C>を持つ表です.各エントリーは, 連続ノード A の確率分布を含みます. |
上記の事例中のすべてのエントリーは,ガウス型正規分布(現在利用可能な連続分布のみ)を格納します.正規分布は,キーワード normal に2つのパラメータのリストを続けて指定します.最初のパラメータは平均で,2つ目は正規分布の分散です.
この事例では,A が1つの離散親 B
と1つの連続親C を持つ連続ノードであると仮定します. B は2つのステート b1 と b2 を,そして C
は正規分布を持ちます.
potential (A | B C)
{
data = ( normal ( 1 + C, 2 ) % b1
normal ( 1 + 2 * C, 2 ) ); % b2
}
このポテンシャル指定の data フィールドは,次元リスト <B> (B は垂直バーの右側の最初に一覧される離散親のみ)を持つ表です.各エントリーもまたは A の連続分布関数を格納します.A の上でのC の影響度は,正規分布の平均パラメータを指定する数式でのC の使用に由来します. |
正規分布の平均パラメータのみが,数式として指定できます.分散パラメータは,数値定数でなければなりません.数式中で可能な演算子は, +, -, および * (加法,減法,乗法).
決定ノードは,割り当てられた関数を持たないので,data フィールドを持つことはできません.したがって,決定ポテンシャル指定は,実際に指定することはできませんが,むしろ情報リンクの使用のためのトリックです.
data フィールドが,ポテンシャル指定から省略されている場合,1のリストは,離散確率ポテンシャルのために供給され,一方,ゼロのリストは効用ポテンシャルのために供給されます.連続確率ポテンシャルにつていは,平均と分散が両方とも0に設定された正規分布のリストが提供されています.
離散確率ポテンシャルの data フィールドの値は,非負の数のみを格納することができます.連続確率ポテンシャルの正規分布の指定では,分散パラメータに非負の数のみが可能です.効用ポテンシャルの値や正規分布の平均パラメータではそのような制約はありません.
ベイジアンネットワークやインフルエンス・ダイアグラムに関する情報は,概してキーワードclass(net言語の第2版では,このキーワードはnetでした)で始まる記述の最初に指定できます- 事例15を参照.最初の行(すなわち "class <net name>")を除いて ,指定全体が波括弧でくくられなければなりません(このシンタックスは打2版で使用されたのとは異なります).
class test
{
inputs = ();
outputs = ();
node_size = (80 40);
...
}
これは,それぞれ入力ノードや出力ノードとして働くネットワークのノードの名前のリストを指定します.これは,Huginグラフィカル・ユーザー・インタフェース内で幅が80ピクセルと高さが40ピクセルのノードが描かれることも指定します. |
現在のところ,net-指定には inputs, outputs, および node_size フィールドのみが定義されています.ただし, ノードと同様に,必要ならどのような追加フィールドでも追加できます.
Hugin グラフィカル・ユーザー・インタフェースの最新バージョンは,特定アプリケーション・フィールドの系列を用います.それらのいくつかをここに示します:
class
{
inputs = ();
outputs = ();
node_size = (80 40);
HR_Grid_X = "10";
HR_Grid_Y = "10";
HR_Grid_GridSnap = "1";
HR_Grid_GridShow = "0";
HR_Font_Name = "Arial";
HR_Font_Size = "-12";
HR_Font_Weight = "400";
HR_Font_Italic = "0";
HR_Propagate_Auto = "0";
...
}
Hugin グラフィカル・ユーザー・インタフェースは,すべてのフィールドで,プレフィックス HR を使用します. |
名前は,Cプログラミング言語での識別子と同じ構造を持ちます.これは,名前が文字で始まる文字と桁の空でないシーケンスであることを意味します.この文脈では,下線文字
文字列とは,引用文字
数とは,場合によっては小数点を含む桁のシーケンスが続く任意符号と,場合によっては符号付き整数が続く'E' または 'e'を含む任意の指数フィールドからなります.
ネット中のどこにでも(名前や数,その他の複数文字の単語要素の中を除いて)コメントを置くことができます.それは空白に相当すると見なされます.コメントは, パーセント文字
この節は,表の row-major "レイアウト" を説明します.この特定の話題に興味がなければ無視して構いません.
表のrow-major 表現での特定のコンフィギュレーションに対応する値を見つけるために,我々は 0 から s-1 の値をインデックスします.ここで s は,リスト中の値の数です.対応するノードのリストが (A1, A2,..., An) であり,ノード Ai が 0 から si-1にインデックスされたsi 個のステートを持つと仮定します.すると,
我々が欲しいのは,コンフィギュレーション (a1, a2,...,
an) のインデックスx です.ここで,ai のステート・インデックスが ji
(![]()
![]()
ここで