- こちらの記事でHaskellをベースにしたProbabilistic programmingについてメモをした
- このペイパーを読みつつHaskellとその中でのMonadの使用方法について勉強した(こちら)ので、少し頭の中を整理してみる
- 確率分布
- 確率分布は、台があって、台に非負の値が乗っていて、それを積分すると1になるもの
- 台Xとその上の要素xがあって、xごとにf(x)>=0がある
- {(x,f(x))}
- こののようなものをコンピュータで扱うときに、{}という箱を用意してその中の要素について関数を適用したい
- 箱に入れて扱うときに、HaskellではMonadを使う。なぜならリストがMonadとして作ってあるから
- 分布を連結処理する
- 確率分布は、台が色々。分布を決めるパラメタ数も色々。色々なものだが、みな等しく「確率分布」の一つなので、「箱」は同じモノを使いたい
- なので、Monad a というように、aが色々なものを取れるような仕組みがよい
- 確率分布を繰り返し処理する
- ある分布からのサンプリングの結果をまとめることは、分布がモナドであればliftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r のように、モナドである分布2つについて、それぞれの分布要素a1,a2の総当り処理をしつつ、分布モナドに戻す、というような処理とすれば簡潔に表せる
Dist(n) =liftM2 (hoge+) Dist(1) Dist(n-1)
liftM2 (+) [0,1] [2..5]
[2,3,4,5,3,4,5,6]
- 分布を要約する
- 分布を要約して統計量を取ることを考える
- 要素が無限個だろうと有限個だろうと、全要素を処理して、スカラーを返すことが基本になる
- 複数の要素があって順繰りに処理するにはfold (foldl, foldr)する
- 確率分布関数と尤度関数のflipな関係
- は確率分布関数
- は尤度関数
- がおなじならは同じ値を返す
- ただし、のいずれか片方が与えられる場合を考えるとき、ハスケルではf::theta->x->Double,g::x->theta->Doubleのように引数順序が変わる
- この変更はg = flip f と書く
- 高次元同時分布
- 同時分布があってそのパラメタを推定したいが、データの取られ方が部分的(射影空間観測)であるような場合には
- p::theta1->theta2->theta3->...-> xa->xb->...->xk -> Doubleのように、分布パラメタと観測ベクトルの成分とをカリー化して渡すような同時分布になるが、
- ここで、観測データとは、あるthetai(の集合)とあるxj(の集合)とが与えられることであって、
- 分布推定とは、それらを使ってpを推定する作業となる