ポテンシャルというと、電位とか、エネルギーとかを思い浮かべるかもしれません。

ここでは、確率分布表(条件付確率分布表)のことを指します。

例としてポテンシャルφ_1とφ_2を下の表に載せます。


塩うめー-表1



ポテンシャルφの領域をdom(φ)と定義します。

例えば、ポテンシャル P(A, B | C) の領域は dom( P(A, B | C) ) = { A, B, C } となります。

上で例として出したφ_1の領域はdom( A , B ) = { A, B } といった感じです。




ポテンシャルは積算することができます.


塩うめー-数式1

積算の例として,φ_1とφ_2の積算を載せます。塩うめー-表2






周辺化の計算は,取り除く変数をAとおくと、


塩うめー-数式2

で表されます。

周辺化の計算例を2つ載せておきます。



塩うめー-表3、4




ポテンシャルの積の周辺化には分配法則が成り立ちます。


塩うめー-数式3

分配法則の例も載せておきます。




塩うめー-表5




もしφ(A, B, C ) からAとBが取り除かれた、周辺化されたとしたら、

φはCで表された(φ is projected down to C)といい、


塩うめー-ふぁいC と表します。





数式エディタが使えないので書きにくいですね・・・

後日加筆予定です。

(参考)Bayesian Networks and decision Graphs

    この記事は、僕が英語を日本語訳した内容なので間違ってても知りませんよー(ぇ

ベイジアンネットワークというのは、

因果関係のある確率事象を有向リンクで接続することで現象を表現するモデルです。




ベイジアンネットワークでは

    ノード:確率変数

    リンク:有向リンク

ネットワーク:非巡回有向グラフ




以下がベイジアンネットワークの例です。


塩うめー-sprinkler net

Cloudy…雲が出ている、出ていないのどちらかの値をとる2値確率変数

Sprinkler・・・スプリンクラーが作動した、作動しなかったのどちらかの値をとる2値確率変数

Rain・・・雨が降った、降らなかったのどちらかの値をとる2値確率変数

WetGrass・・・芝生が濡れている、濡れていないのどちらかの値をとる2値確率変数


有向リンクはノードの因果関係を表しています。

例えば、CloudyからSprinklerに向かってリンクが引かれています。

これはCloudyのとる状態がSplinklerの確率分布に影響を与えることを意味しています。

各ノードは条件付確率分布表を持っていますが、

Splinklerの確率分布は、親ノードであるCloudyの状態によって変わります。
同様にWet Glassの確率分布は親ノードであるSplinklerとRainの状態によって変わります。




ベイジアンネットワークを作成するには

①現象を説明する確率事象を決める(どんなノードを用いるか決める)

②構造学習を行う(有向リンクの引き方を決める=ノード間の因果関係を求める)

③パラメータ学習を行う(各ノードの条件付確率分布表を求める)




ベイジアンネットワークを用いて確率推論というものを行うことが出来ます。

確率推論とは、あるノードの状態が観測できたときに、他の未観測のノードの確率変数を求めることです。

例えば、「Splinklerが作動しなかった」という観測情報が得られたときに

「芝生が濡れている」確率を求めるなどです。




ベイジアンネットワークは、

患者の症状や検査結果から病名を推定するシステム、

過去の購入履歴からおすすめの商品をピックアップするシステムなどに使われているそうです。

(過去の購入履歴というノードの観測情報から、

ユーザーの興味のありそうな商品が何なのか確率推論で求めるというわけですね。たぶん。)

※このページはカルフォルニア大学の「How to use the toolbox」と、

※インターネットアーカイブに保存されていた

http://www.globe.to/~oka326/archive/BNET/bnet-usage-ja.html

※を参考に書いています。


前回作成したベイジアンネットワークを用いて確率推論をしてみましょう。

確率推論とは、ある事象が観測されたとき、その他の事象の生起確率を計算することです。

観測情報のことを証拠、エビデンス(evidence)といいます。

今回は「芝生が濡れているとき、スプリンクラーが作動していた確率」を求めてみます。



①まず、確率推論に用いるアルゴリズムを指定してあげます。


engine = jtree_inf_engine(bnet);


これは、確率推論エンジンにジャンクションツリーアルゴリズムを使うことを表しています。

ジャンクションツリーアルゴリズムについてはまたの機会に。



②次に、観測情報を入力します。

芝生が濡れている、つまりW=2であることが観測されています。

その他の事象、C,S,Rについては観測されていません。


evidence = cell(1,N);
evidence{W} = 2;

1行目は evidence = [ [ ] [ ] [ ] [ ] ] という1×Nのセル配列を作成しています。

2行目で evidence = [ [ ] [ ] [ ] [2] ] となり、観測情報が入力されました。

[ ] という空のセルは観測情報がないことを表しています。



③engine に evidenceを入力します。


[engine, loglik] = enter_evidence(engine, evidence);


enter_evidenceという関数の振舞いはengineに依存しており、

今回のjunction treeアルゴリズムでは

戻り値の第1引数には evidence が追加された engine が、

戻り値の第2引数には evidence の対数尤度が入っています。



④最後に、周辺分布の計算をします。


marg = marginal_nodes(engine, S);
p = marg.T(2);

1行目のmarginal_nodesは第2引数のノードの周辺分布を計算します。

周辺分布は英語でmarginal distributionです。

戻り値は構造体です。Sの周辺確率はmarg.Tに入っています。

2行目で、S=2の確率をpに渡しています。

実行結果は

>> p

p =

0.4298

となります。

これで、P(S=2|W=2)=0.4298であることがわかりました。



⑤ついでに同時分布も計算してみましょう。

(同時分布・・・複数の確率変数の確率分布

周辺分布・・・各確率変数の確率分布     by Wikipedia)


evidence = cell(1,N);
[engine, ll] = enter_evidence(engine, evidence);
m = marginal_nodes(engine, [S R W]);

>> m.T
ans(:,:,1) =
0.2900 0.0410
0.0210 0.0009
ans(:,:,2) =
0 0.3690
0.1890 0.0891

これで、エビデンスがないときのS,R,Wの同時分布を求められます。

m.Tは、

  S=1,R=1 S=1,R=2

  S=2,R=1 S=2,R=2

という並びになっています。(たぶん)


ちなみにS R Wの同時分布は求めることができましたが、

C R Wの同時分布は求めることができません。

私も詳しい理由は判りませんが、

おそらくはジャンクションツリーの生成方法が関係しているのかな~

と思います。

(モラル化とか三角化とか)

※このページはカルフォルニア大学の「How to use the toolbox」と、

※インターネットアーカイブに保存されていた

http://www.globe.to/~oka326/archive/BNET/bnet-usage-ja.html

※を参考に書いています。


試しに下の図のようなベイズネットを手入力で作ってみましょう。


塩うめー-sprinkler net



①隣接行列を作る


有向非巡回グラフ(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、って感じ)
塩うめー-CPD(W)

この場合、

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]);


研究でベイジアンネットワークを扱うことになりましたので、

それを扱うソフトを探してました。


1.Bayonet(有料)

2.Hugin(有料)

3.MSBNx(無料だけど使いにくい?)

4.Bayes net toolbox(MATLAB(有料)があれば無料)


個人的には、扱いやすそうで日本製のBayonetというソフトを使いたかったんですが、

研究室にMATLABというソフトのライセンスがあってしまった運よくあったので

Bayes net toolboxを使っていく羽目になりました。


「ベイジアンネットワーク概説」という本によると、

・実用的なソフトというよりは新たなアルゴリズムの評価実験を行う用途に向いている

・「GUIなどは未整備であるため、ベイジアンネットワークやMATLABについての

 理解がないと難しい


と、書いているので僕のような初心者には向いてないソフトですね、わかります!




Bayes net toolboxはカルフォルニア大学が管理している、

MATLAB上で動くオープンソースなので無料です。

(MATLABは有料ですが)


Bayes net toolboxは以下のページの「Download zip file」からダウンロードできます。

http://www.cs.ubc.ca/~murphyk/Software/BNT/bnt.html

ダウンロード後、解凍したファイルをMATLABがインストールされているフォルダにでも

移動しておきましょう。

MATLABを起動し、画面上の「ファイル>パスを設定>サブフォルダも追加」から

解凍したフォルダを選択、保存をクリックした後に閉じるを押せば

Bayes net toolboxが利用可能になります。

Command Windowで test_BNT と入力し、ちゃんと動いてるようならインストール完了です。


さて、上のURLのページに「How to use the toolbox」というページがあります。

このツールボックスの使い方が書かれていますが、英語です(まぁ、当然ですよね・・・^^;)

このページの日本語訳が実は”過去”にあったようです。

以下がその跡地です。

http://www.globe.to/~oka326/archive/BNET/bnet-usage-ja.html

404ですが、インターネットアーカイブに保存されているので、そちらを使いましょう。

ただし、全てが日本語に訳されているわけではなく、

また、マニュアルのバージョンも現在のものとは異なっており、注意が必要です。



やっとPCが直ったよ!

モニター以外にも冷却ファンも壊れていてお金かかったよ!

研究が忙しくて大変だよ!

使ったことが無いソフトいじるから大変だよ!

しかも英語のソフトだからもっと大変だよ!


うわーーーっ

前の火曜日、壊れたノートPCを修理に出しました。

修理は普通3週間程度かかります。長い・・・(´д`lll)


ちなみに東芝の場合、予約をした上で秋葉原の修理センターに持ち込むと

1日で直してくれるサービスをやっています。

ただ、東芝の保障に入っていないと高いです。

私はヨドバシカメラの保証にしか入っていなかったので、ヨドバシの修理受付に行きました。

皆さん、あなたの目の前にあるだろうキーボードとマウスについて特に何か考えたことはありますか?

私はありません。(ぉ


しかし、パソコンを使っているときは常にキーボードかマウスに手が触れているわけです。

つまり、パソコン使用中は体の一部のようなものなのです。


(あと、FPSゲームをやってる人にとっては反応速度とか大切でしょうねw)


そんなマウスとキーボードを高性能なものに変えるとどうなるのでしょう?

研究室の私のキーボードとマウスが高性能になったので、感想会です。



塩うめー-キーボード

これは REAL FORCE UBK91です。多分1万5千円以上です^^;

REAL FORCEって名前だけでカッコよくね?よくね?

ちなみにテンキーレスです。

テンキーなんて不要ですし、テンキーがあると横長過ぎるんですよ。

このすっきりして安定感あるフォルムこそ至高・・・<何言ってんだ


んで、使用感ですが、タッチの軽さに驚きました!

あまりに軽いので、慣れないうちはちょ~と指をのっけただけで入力されてしまうので大変ですが、

指にかかる負担が違うと思います。


友達の話では、「A」とか小指で押すキーは中央のキーより軽いといったように、

キーごとに重さが違うという配慮っぷりらしいです。




塩うめー-マウス

こちらは Logicool の MX Revolutionというマウスです。1万円以上です。

キーボードは有線式ですが、マウスは無線式を注文しました。

クレードル式で充電台に置いて充電します。電池交換いらずです。


使ってみると、滑りがよく動かしやすいです。

キーボードは多少慣れが必要でしたが、こちらは比較的すぐに馴染みました。

ドラッグした部分を検索できる「検索ボタン」、

Alt+TABの機能を持っている2つ目のホイール、

選択中のウインドウによって機能が異なる「進む/戻るボタン(?)」と

7ボタンもついており、操作性も抜群です。

伝説のすた丼屋というお店の秋葉原店が5月22日にオープンしました。

http://www.antoworks.com/index2.html

22日と23日は先着千名まですた丼と生姜丼が100円でした。


と、いうわけで、22日に行って100円で食べてきました。

11時ごろに行くと整理券を配っていました。


塩うめー



整理券を2枚持っているのは友人と一緒に行ったからです。

11時半過ぎに行くと行列ができてました。

店員の方に整理券を見せると、71番目の人と74番目の人を探して

その間に並ばせてもらえました。
整理券番号順にきっり並ばせているようで、人が来ると

「後ろに2歩ずつ下がってくださーい!」という声が掛かります。

さすがに几帳面すぎるかもw

たいてい、1~20、21~40番のグループとか作るぐらいにするとかもっと適当ですよね。

ただ、私もそういう面では几帳面なほうなのでこの姿勢は支持しますw


12時半ごろにようやく店内へ。すた丼を注文しました。

味の方は、にんにくが非常に食欲をそそり美味しかったです。

ご飯が多いので、大盛りにする必要はあまり無いと思います。

量が多いので途中で味が単調に感じるかも?

卵は最初から丼に乗っているのではなく、別のお皿に入れてきます。

なので、味を途中で変えるためにも、最初に卵をかけるのではなく

半分ぐらい食べてから卵をかけるのをお勧めします。


さて、この店舗なのですが、23時まで営業しています。

お店が閉まるのが早い秋葉原では、それだけでも利用価値があると思います。

チャーハンやラーメンもあるようなので、何度か利用してみたいです。

遊んだりすると忙しいぞ!

呑んだり遊ぶのは週に2日までにしないと忙しくなるNE☆

ブログも下書きまでしかできないよ。


でも、就職活動が修了しましした。

これで修士論文に集中できる!勝てる!

富士通さんの子会社から内定をいただきました。職種はSEです。

ググると、2ch情報だけど月平均100時間残業だって!100時間残業だって!

繁忙期MAX100時間なら余裕なんですけどね。


でも、業務内容がちょっと特殊、かつ、やりがいがありそうなので行ってもいいかなー・・・

働かされるけど、お金を使う暇が無い⇒おっかねもち!おっかねもち!

フハハハ・・・PS3でもプラズマテレビでも何でも買えるぞー!

(遊ぶ暇無くなるけどorz)