※
※このページはカルフォルニア大学の「How to use the toolbox」と、
※インターネットアーカイブに保存されていた
※http://www.globe.to/~oka326/archive/BNET/bnet-usage-ja.html
※を参考に書いています。
※
試しに下の図のようなベイズネットを手入力で作ってみましょう。
①隣接行列を作る
有向非巡回グラフ(directed acyclic graph:DAGと略す)を指定するため、
隣接行列を作ります。
N = 4;
C = 1; S = 2; R = 3; W = 4;
dag = zeros(N,N);
dag(C,[R S]) = 1;
dag(R,W) = 1;
dag(S,W)=1;
//1行目
Nをノードの数を表す変数とします。
//2行目
各ノードの番号は(頭文字をとって)
C = 1、S = 2、R = 3、W = 4 とします。
//3行目
dagをN×Nの零行列とします。
「 0 0 0 0 |
dag = | 0 0 0 0 |
| 0 0 0 0 |
| 0 0 0 0 」
//4~6行目
ノードCからノードR、ノードCからノードSにリンクが引かれているので
dag(C,R) = 1, dag(C,S) = 1とします。
同様に、dag(R,W) = 1、dag(S,W)=1とします。
これによりdagは以下のようになります。
「 0 1 1 0 |
dag = | 0 0 0 1 |
| 0 0 0 1 |
| 0 0 0 0 」
②ノードの大きさと型を指定する
離散型のノードの大きさは、そのノードが取りうる値の数です。
TとFの2値を取るノードの大きさは2です。
今回は1~4全てのノードが離散型で、ノードの大きさは2です。
離散型のノードの集合を表す変数discrete_nodesは
discrete_nodes = 1:N;
ノードの大きさを表す変数node_sizesは
node_sizes=[2 2 2 2]; または node_sizes = 2*ones(1,N);
と書けます。
one(A,B)はA×Bの全ての要素が1の行列です。
③ベイジアンネットの作成
mk_bnet という関数を使ってベイジアンネットを作成します。
bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes);
と書きます。
第1引数は隣接行列、第2引数はノードの大きさです。
第3引数の'discrete'は直後の引数(第4引数)が離散型のノードであるとしています。
ちなみに、今回のように全ての引数が離散型の場合、
ノードの型についての記述は省略することができるので、
bnet = mk_bnet(dag, node_sizes);
でも大丈夫です。
④パラメータの入力
パラメータとは、あるノードiの親ノード集合Parent(i)がjという値の組合せをとったとき、
ノードiがkという値をとる確率です。言葉にすると分かりにくいかもしれませんね。
日本語だと母数とか訳されます。
ノード4(W)を例に見ていきましょう。
ノード4の条件付確率分布は以下のとおりです。(F=1、T=2としています)
prob.のところがパラメータです。
(ノードWの親ノードの集合SとRがある組合せ(例えばS=2、R=1)をとったとき、
Wがある値(例えば2)をとるときのパラメータは0.9、って感じ)
この場合、
bnet.CPD{W} = tabular_CPD(bnet, W, 'CPT', [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);
とすればOKです。
ノード1~3についても同様に記述しましょう。
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);
これで、上の図のベイジアンネットワークは完成です。
このネットワークを例として確率推論やパラメータ学習、構造学習の勉強をしていきます。
[まとめ]
これでベイジアンネットワークが作れます
N = 4;
C = 1; S = 2; R = 3; W = 4;
dag = zeros(N,N);
dag(C,[R S]) = 1;
dag(R,W) = 1;
dag(S,W)=1;
node_sizes = 2*ones(1,N);
bnet = mk_bnet(dag, node_sizes);
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);