# テーブル・ジェネレータのチュートリアル

このチュートリアルは，離散確率ノードの条件付き確率表（CPT）と効用ノードの効用表の指定を簡単にするために，テーブル・ジェネレータ機能をどのように使用するかを説明する．このチュートリアルは，モデルと数式を用いて，これらの表がどのようにコンパクトに記述できるかを説明する．これはとくにある変数の条件付き確率分布が（少なくとも近似的に）特定の関数または分布の形に従う場合に有用である．このようなケースでは， 条件付き確率表（CPT）を手動で指定するのは，面倒なものである．

利用可能な数式の種類はノードの種類によるので，Hugin Decision Engineでサポートされているさまざまなノードのサブ・タイプを議論することで明らかになるであろう．

モデルは，離散ノードの一覧と数式の集合（ノードのステートの各コンフィギュレーションごとに１モデル）からなる．モデルのノードの一覧は，モデル・ノードと呼ばれる．

数式は，標準の統計的分布（たとえば，正規，二項，ベータ，ガンマなど），算術演算，標準の数学的関数（たとえば，対数，指数，三角，双曲線関数），論理演算（たとえば，andやif-the-else），関係（たとえば，＜や＝）を用いて構築される．

数式は，手動で構築する （数式のシンタックスを参照）こともできるし，一連のダイアログ・ボックスを用いて構築をガイドする 数式ビルダーの支援によって構築することもできる．

### 離散ノードのサブ・タイプ

数式の中で用いられるさまざまな演算は,さまざまな戻り型とさまざまな引数の要件を持つ．したがって，数式を指定するための表現豊かな言語を提供するために，離散確率ノードと決定ノードを異なるグループに分類するのが都合よい（ノードのタイプの節も参照）:

- ラベルつきノードは，同等比較や決定論的関係性の表現のために使用できる．たとえば，ステート "State 1" と "State 2"を持つラベルつきノードC1は， 'if (C1 == "State 1", Distribution (0.2, 0.8), Distribution (0.4, 0.6))' for P(C2 | C1)のような数式の中に現れることができる．ここで，C2 は，2つの可能なステートを持つもう1つの離散確率ノードである．
- 論理 ノードは，真偽値 'false' および 'true' （その順で）を表現し論理演算の中で使用できる．たとえば，ある論理ノードB0で，その（論理）親の論理ORであるB1, B2, および B3, P(B0|B1, B2, B3) は， 'or (B1, B2, B3)'として簡単に指定できる．
- 数字つき ノードは，数字（整数または実数）の増加シーケンスを表現し，算術演算や数学的関数などで使用できる．
- 区間 ノードは，数直線上の互いに素な区間を表現し，数字つきノードと同様に使用できる．さらに，連続量を離散化するときの区間を指定するのにも使用できる．

数字つきノードと区間ノードは，併せて数値ノード と呼ぶ．

### 一定値

以下の種類の定数が数式の中で使用できる:

- ステート・ラベル（すなわち，引用文字 (")でくくられた文字のシーケンス）．
- 数値 （整数，実数，および整数や実数の区間）．たとえば，有効な数式は"X + 3.4" （引用文字なし；でなければ，ステート・ラベルとして解釈される），ここで， X は数値ノードの名前．
- 無限．正の無限は"inf"（引用文字なし）で，負の無限は"-inf"で表記される．
- 論理値: "false" と "true" （引用文字なし）． 論理定数は，小文字を用いて示されることに注意．

### モデル・ノード

とても頻繁に，1つまたは複数の親ノードのステートによって，異なる数式が必要なことがある．何段もネスト化されたif-then-else 式の使用は，これに対処する1つの方法である．しかしながら，結果の式は， しばしばとても複雑になり，ゆえに，目視検査で計算するのが難しく，したがって，保守が難しい．

複雑な数式を簡単にするために，モデル・ノードの考え方は，とても有用である．

上記で述べたように，CPTのモデルは，モデル・ノードの一覧とモデル・ノードのステートの各コンフィグレーションごとの数式からなる．つまり，モデル・ノードがない場合，モデルは単一の数式を格納する．

特定のモデルのモデル・ノードは，モデルが属しているノードの親の部分集合を構成する．この部分集合は，ノードのプロパティ・ダイアログ・ボックスの表タブの下で指定される．

モデル・ノードの使用の事例は，下記の事例 確率変数の離散化で説明する．

### 簡単な事例

#### 人々の数

いくつかのアプリケーションで，男性と女性の数で確率分布を持つとしよう．ここで，分布は，区間 [0 - 100), [100 - 500), [500 - 1000)で定義される．そして， 我々は，2つの前者の分布を仮定して，人の合計数での分布を計算したいとしよう．これは簡単であるが， P(NI | NM, NF)を定義するのは面倒である．ここで， NI, NM, NF は，それぞれ，人の数，男性の数，女性の数の略である．この条件付き確率を指定するより都合のよい方法は， NM と NF がステート [0 - 100), [100 - 500), [500 - 1000)を持つ区間ノードで表現され， NI がステート [0 - 200), [200 - 1000), [1000 - 2000)を持つ区間ノードで表現され，そして，簡単な数式NI = NM + NFで P(NI | NM, NF) を表現するようにすることだろう．

その式を指定するために，まず，数式モードを選択する． ノード表のチュートリアルを参照．次に，左クリックで数式テキスト・フィールドを有効にする． 最後に，キーボードを使って，文字列 "NM + NF"（引用文字はなし）をタイプする．図1 は，この数式によるノードNIの結果の表と結果のCPTである．ここで，表示される数字は， "関数"メニューの"式"サブ・メニューから"表として表示"項目を選択して，数式から生成される．

図 1: 数式から指定されたCPT．このCPTは，親 NM と NFを持つ離散確率ノード NI について指定されている．

#### 公正な目かイカサマの目か?

もう1つの事例として，公正な目とイカサマの目で， n 回サイコロを振ってn回6の目を得る確率を計算する問題を考えよう．公正な目でn 回サイコロを振って得られる6の目の数を意味する確率変数 X は，パラメータ (n, 1/6)を持つ二項分布に従う．したがって， 公正な目でn回サイコロを振って，k 回6の目を得る確率は，P(X = k)である．ここで， P は Binomial(n, 1/6)である．イカサマの目の場合，1回サイコロを振って6の目を得る確率が1/5であるとしたら，イカサマの目でn回サイコロを振って k 回6の目を得る確率は，'Q(X = k)である．ここで，Q は Binomial(n, 1/5)である．

この問題のベイジアンネットワークを図2に示す．ここでノード n6s （ "# 6's"とラベルづけ）は，ノード n_rolls（"# rolls"とラベルづけ）で表現するサイコロを振る回数に従属し，そして，ノード fake_die（"Fake die?"とラベルづけ）で表現される目がいイカサマである確率に従属する．ここで，我々は n_rolls をステート 1, 2, 3, 4, 5を持つ数字つきノードとし，fake_die を論理ノードとし，そして， n6s をステート 0, 1, 2, 3, 4, 5を持つ数字つきノードとするなら， P(n6s | n_rolls, fake_die) は，式 P(n6s | n_rolls, fake_die) = Binomial (n_rolls, if (fake_die, 1/5, 1/6))を用いてとてもエレガントに指定できる．

図 2: イカサマ・サイコロ問題のためのベイジアンネットワーク

この式を指定するために，我々は 人々の数 の事例のように進めることもできるし，数式ビルダー（"関数"メニューの"数式"サブ・メニューの"数式を作成"項目を選択して起動）を使用することもできる．指定の結果と生成された確率を図3に示す．

図 3: 簡単な数式でとてもコンパクトに指定されたイカサマ・サイコロ問題のCPT

同等に P(n6s | n_rolls, fake_die) = if (fake_die, Binomial (n_rolls, 1/5), Binomial(n_rolls, 1/6))を指定できることに注意．

#### 確率変数の離散化

P(C1 | C2) が，C2によって与えられる平均と分散 1 を持つ正規分布で近似できると仮定する．ここでC2 は， ステート [-5,-1), [-1,0), [0,1), [1,5) を持つ区間変数である． 区間 [-infinity,-5), [-5,-2), [-2,0), [0,2), [2,5), [5,infinity)で与えられるC1 の離散化が適当であることがわかっているなら，我々は P(C1 | C2) を簡単に Normal(C2, 1) として指定することができる．図4参照．

図 4: （区間）親変数 C2 で与えられる平均と分散 1　を持つ正規分布の離散化によって指定された変数 C1 のCPT.

さらに，もしC1 が，"State 1" と"State 2"というステートを持つC3というラベルつきノードをもう１つの親ノードとして持っていて，その正規分布の分散が1で，C3 がステート "State 1" と 1.5にあるとき， C3 がステート"State 2"にあるとき，我々は，C3のさまざまなステートごとのさまざまな数式を指定できるいわゆるモデル・ノードとしてC3を定義できる．図5参照．

図 5: C1 が，さまざまなステートのさまざまな数式の指定ができるモデル・ノードとして定義された新しい親ノードC3を得たことを除いては， 図 4 と同様．

我々は，(モデル）ノードのステートで代替的に条件づけできるので，モデル・ノードの使用は厳密には必要ないことに注意せよ．しかしながら，モデル・ノードの使用は， しばしば，雑然とした指定を整然とさせ，読みやすく，メンテナンスしやすくする．たとえば，C3をモデル・ノードとして指定しない場合，P(C1 | C2, C3)は， 式 P(C1 | C2, C3) = if (C3 == "State 1", Normal (C2, 1), Normal (C2, 1.5))で指定できる．図6参照．

図 6: C3をモデル・ノードとして指定する代わりに，2つの式が C3のステートで条件づけする１つの式に融合されてることを除いて，図 5 と同様．

### 演算子と関数

式を構成するために利用できる演算子と関数は，下記のとおり．

#### バイナリ演算子

下記のバイナリ（2項）演算子が，数式に適用できる．

- + (加算)
- - (減算)
- * (乗算)
- / (除算)
- ^ (累乗)

事例:

- C1 + C2
- C1 ^ 3

ここで C1 と C2 数値ノードの（すなわち，数字つきノードや区間ノード）．

#### 単項演算子

単項演算子を用いて数式を打ち消すことができる:

- - (否定)

#### バイナリ比較演算子

下記のバイナリ（2項）演算子が，ラベル（すなわち，文字列），数字，論理を比較するために使用できる（両方の演算対象は同じ種類でなければならない）．等価演算子（すなわち，= と !=）だけは，ラベルと論理の式に適用できる．各演算子は，ブール値を返す．

- = (等価)
- == (等価)
- != (不等価)
- <> (不等価)
- < (より小さい)
- > (より大きい)
- <= (以下)
- >= (以上)

事例:

- C1 == C2
- C1 > 5

ここで，C1 と C2 は，数値ノードである（すなわち，数字つきノードや区間ノード）．

#### 最小および最大関数

以下の関数は，数式の一覧の最小値と最大値を計算する．

- min(x1, x2, ..., xn) は，引数式の最小値を返す．
- max(x1, x2, ..., xn) は，引数式の最大値を返す．

事例:

- min(C1, C2, 10)
- max(min(C1, C2, 10), max(C3, C4))

ここで， C1, ..., C4 は，数値ノード（すなわち，数字つきノードや区間ノード）．

#### 標準数学関数

以下の一覧は，単一の数式に適用できる標準的数学関数である．

- log(x) は，x の自然対数（すなわち，底e）を返す．
- log2(x) は，x の底 2 の対数を返す．
- log10(x) は，x の底 10の対数を返す．
- exp(x) は，x の指数（すなわち， e^x）を返す．
- sin(x) は，x の正弦を返す．
- cos(x) は，x の余弦を返す．
- tan(x) は，x の正接を返す．
- sinh(x) は，x の双曲線正弦を返す．
- cosh(x) は，x の双曲線余弦を返す．
- tanh(x) は，x の双曲線正接を返す．
- sqrt(x) は，x の平方根を返す．
- abs(x) は，x の絶対値を返す．

事例:

- log(C1)
- abs(sin(C1))

ここで，C1 は，数値ノード（すなわち，数字つきノードや区間ノード）．

#### 床関数と天井関数

床関数と天井関数は，実数表記の結果を整数に四捨五入する．

- floor(x) は，x 以下の最大整数を返す．
- ceil(x) は，x 以上の最小整数を返す．

事例:

- floor(C1 * C2)
- ceil(C1 ^ 2)

ここで C1 とC2 は，数値ノード（すなわち，数字つきノードや区間ノード）．

#### Modulo 関数

modulo 関数は，2つの数値表記の割り算の余りを返す．もちろん，除数表記はゼロであってはならない．

- mod(x,y) は， x - y * floor(x / y) を返す．ここで， x と y は， y != 0 での任意の実数．

事例:

- mod(C1, C2 ^ 2)

ここで，C1 と C2 は，数値ノード（すなわち，数字つきノードや区間ノード）．

#### If-Then-Else

条件式（3つの引数による）が指定できる:

- if(px, tx, fx), ここで px は論理式でなければならず，第2と第3の引数は同じタイプでなければならない． px が'true'と計算された場合，式 tx の値が返され; それ以外は，式 fx の値が返される． if-式のタイプは，tx と fx のタイプである．

事例:

- if(FakeDie, Binomial(n, 1/2), Binomial(n, 1/6))
- if(C1 == C2, Distribution(1, 2), Distribution(1, 3))

ここで，FakeDie は論理ノードで，n は数値ノード，そして C1 と C2 は任意の（ただし同一の）タイプのノードである．

#### 論理演算子

以下の標準的論理演算子が利用可能である．これらはすべて論理式を引数としてとる．

- and(x1, x2, ..., xn) は，すべての引数式が 'true' と計算される場合，'true' を返す．
- or(x1, x2, ..., xn) は，最低1つの引数式が 'true' と計算される場合，'true' を返す．
- not(x) は，x が 'false' と計算される場合，'true' を返す; それ以外は，'false' を返す．

'and' の引数式の計算は，シーケンシャルに行われ，ある引数が 'false' と計算されると，計算を終了する． 同様に，'or' の引数式の計算は，ある引数が 'true'　と計算されると終了する．

事例:

- and(C1, or(C2, not(C3)))

ここで， C1， C2， C3 は論理ノード．

#### 統計的連続分布

たくさんの統計的連続分布が利用可能である．詳細は，連続分布を参照．

- Normal
- LogNormal
- Beta
- Gamma
- Exponential
- Weibull
- Uniform
- Triangular
- PERT

#### 統計的離散分布

たくさんの統計的離散分布が利用可能である．詳細は，離散分布を参照．

- Binomial
- Poisson
- Negative Binomial
- Geometric
- Distribution
- Noisy OR

### 統計的分布

#### 連続分布

以下の連続分布関数は，区間ノードについてのみ利用可能．

関数 | ノードの条件 | 説明 | 引数 | 引数範囲
Normal | 区間: 最初のステートは -infから始まる． 最後の区間は，Last infで終わる． |  | Mean | (-inf, inf)
Variance | (0, inf)
LogNormal | 区間． |  | Mean | (-inf, inf)
Variance | (0, inf)
Location (optional) |
Beta | 区間．最初のステートは下限で始まる．最後の区間は上限で終わる（引数参照）． | 指定をしない場合は，引数の下限と上限は，それぞれ， 0 と 1 になる． | Alpha | (0, inf)
Beta | (0, inf)
Lower (optional) | (-inf, Upper)
Upper (optional) | (Lower, inf)
Gamma | 区間: 最初のステートは0の下で始まる．最後の区間は， infで終わる． |  | Shape | (0, inf)
Scale | (0, inf)
Location (optional) |
Exponential | 区間: 最初のステートは0の下で始まる．最後の区間は， infで終わる． |  | Lambda | (0, inf)
Location (optional) |
Weibull | 区間: 最初のステートは0の下で始まる．最後の区間は， infで終わる． |  | Shape | (0, inf)
Scale | (0, inf)
Location (optional) |
Uniform | 区間: ステートの区間は，下限と上限をカバーする． - 少なくとも終点では（引数参照）． |  | Lower | (-inf, Upper)
Upper | (Lower, inf)
Triangular | 区間. |  | Min | (-inf, Mode)
Mode | (Min, Max)
Max | (Mode, inf)
PERT | 区間. | 3-パラメータ型を用いる場合， Shape パラメータは 4. | Min | (-inf, mode)
Mode | (min, max)
Max | (mode, inf)
Shape (optional) |

事例:

- Normal(C1, C2) - は，数値親ノード C1 の値で平均を，もう１つの数値親ノード C2 の値で分散を与えられる正規分布から区間ノードの条件付き確率を指定する．

切り詰め演算子:

さらに，切り詰め分布を形成するために，切り詰め演算子を統計的連続分布に適用することができる．この演算子は，２つまたは３つの引数をとる．3つの引数が指定される場合，第1と第3の引数は，それぞれ左と右の切り詰め点を意味する数式で，一方，第2の引数は切り詰められるべき分布を意味する．
第1か第3の引数のどちらかは省略することができる．第１の引数を省略すると，右側切り詰め分布となり，第3の引数を省略すると，左側切り詰め分布となる．

事例:

- truncate (-4, Normal (0, 1), 4) - 切り詰め正規分布の指定．この分布は，左側が -4 で，右側が 4　で切り詰められる．
- truncate (4, Normal (0, 1)) - 左側切り詰め（-4で）正規分布．

#### 離散分布

さまざまな離散分布関数が指定できる． 数値ノードに指定される4つの標準の統計的分布関数がある．'Distribution'と呼ぶ特別な関数は， 数式で問題の変数の各可能な結果を指定して，任意の分布関数を指定できる．

関数 | ノードの条件 | 説明 | 引数 | 引数範囲
Binomial | 数字つき: 0, 1, 2, ... , n |  | n | 0, 1, 2, ...
p | [0, 1]
Poisson | 数字つき: 0, 1, 2, ... , n | n が確率を得る．n, n+1, ... の塊 | Mean | (0, inf)
Negative Binomial | 数字つき: 0, 1, 2, ... , n | n が確率を得る．n, n+1, ... の塊 | r | (0, inf)
p | [0, 1]
Geometric | 数字つき: 0, 1, 2, ... , n | n が確率を得る．n, n+1, ... の塊 | p | [0, 1]
Distribution | ラベルつき，論理，数字つき | 任意の分布を指定可能 | An arbitrary number of expressions |
Noisy OR | 論理 | ノン・ゼロ漏えい確率の指定が可能 | Parents | Boolean nodes
Inhibitors | [0, 1]

事例:

- Binomial(4, 0.2)
- NegativeBinomial(sqrt(10), 0.4)
- NoisyOR(C1, 0.1, C2, 0.05, true, 1) - 論理原因（親）ノード C1 が'true' で C2 が'false'なら, 論理結果ノードが確率1 - 0.1で 'true' であると指定．論理原因（親）ノード C2 が 'true' で C1 が 'false'なら1 - 0.05，C1 と C2 が両方とも 'true'なら 1 - 0.1*0.05. さらに， C1 と C2 が両方とも 'false'なら結果ノードが確率1で'false' であると指定（すなわち，ゼロの漏えい確率がこの事例で指定される）．
- Distribution(if(C1 = "State 1", 3, 5), 2) - ラベルつき親ノードC1を持つバイナリ・ノードの分布を指定．

### 数式のシンタックス

<Expression> ::= <Simple expression> <Comparison> <Simple expression> |

<Simple expression>

<Simple expression> ::= <Simple expression> <Plus or minus> <Term> |

<Plus or minus> <Term> |

<Term>

<Term> ::= <Term> <Times or divide> <Exp factor> |

<Exp factor>

<Exp factor> ::= <Factor> ^ <Exp factor> |

<Factor>

<Factor> ::= <Unsigned number> |

<Node name> |

<String> |

false |

true |

(<Expression>) |

<Operator> (<Expression sequence>)

<Expression sequence> ::= <Empty> | <Expression> [, <Expression>]*

<Comparison> ::= == | = | != | <> | < | <= | > | >=

<Plus or minus> ::= + | -

<Times or divide> ::= * | /

<Operator> ::= truncate | Normal | LogNormal | Beta | Gamma | Exponential | Weibull | Uniform | Triangular | PERT

Binomial | Poisson | NegativeBinomial | Geometric | Distribution |

NoisyOR | min | max | log | log2 | log10 | exp |

sin | cos | tan | sinh | cosh | tanh |

sqrt | abs | floor | ceil | mod |

if | and | or | not

Back