MATHGRAM

主に数学とプログラミング、時々趣味について。

python: 二次元正規分布の周辺化

”ブログを更新してない” == ”実装の練習をしてない”


もっと更新しないといかんですな。

今回はUdemyで配信されてる授業、"ベイズ推定とグラフィカルモデル"からの練習。

周辺化

周辺化(Marginalization)とは、
パラメータごとに積分を行い、パラメータの数を減らす操作のことを言います。

例えば同時分布Pr(x,y)があったとします。
同時分布とは二つのパラメータに関しての確率分布のことです。
(3,3)はめっちゃ起こりやすい、87%!!
(1,2)はほとんどないよ、4%!!
・・・みたいなもの。

同時分布は確率分布の定義に沿っているので全部の点に関して和をとったら、1になります。
ってことでPr(x,y)が連続分布だとして、

 \displaystyle \iint_D Pr(x,y) dxdy = 1

が成立。離散だったら \Sigmaに変わるだけですね。

ここで、xyにのみ積分をしたらどうなるか。
二次元分布が一次元分布になってパラメータが一個なくなります。
これが周辺化。文字じゃわかりづらいので図を作ります。

可視化で確認

二次元正規分布のヒートマップを作ります。

こちらの記事を参考に、というか丸パクリさせてもらいました。
まあ、ここがメインではありませんので御容赦くだせえ。

ってことで、ヒートマップはこんな感じ。
f:id:ket-30:20160217120543p:plain:w500,h400
こいつをx,yに関してそれぞれ周辺化してみます。

#周辺化
Ym = np.sum(Z,axis=0)
Xm = np.sum(Z,axis=1)
plt.figure(2)
plt.plot(x,Ym)
plt.savefig("Ym.png")
plt.figure(3)
plt.plot(Xm,y)
plt.savefig("Xm.png")

上のコードを付け加えると周辺化されます。
やっていることはZの二次元配列を行、列ごとに和を取っているだけ。
コードの上では連続も離散も、とにかく和ですからね。sumでいいんです。

出てきた画像がこちら。


f:id:ket-30:20160217121243p:plain:w300,h300

f:id:ket-30:20160217121237p:plain:w300,h300

綺麗に正規分布が出てきました。
またこの式、

 \displaystyle \iint_D Pr(x,y) dxdy = 1

からも分かるように、この正規分布積分したら1になります。
つまり周辺化により作られたこれらの分布も確率分布の定義に沿っていますね。



以上です。
周辺化は大事な概念なので、簡単だけどしっかり理解しとかないと。


p.s. 定期的に書かないと、記事書くこと自体に時間がかかっちゃうわ。