Haskell でProbabilistic programming その2

  • こちらの記事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(x|\theta)は確率分布関数
    • g(\theta|x)は尤度関数
    • x,\thetaがおなじならf,gは同じ値を返す
    • ただし、\theta,xのいずれか片方が与えられる場合を考えるとき、ハスケルではf::theta->x->Double,g::x->theta->Doubleのように引数順序が変わる
    • この変更はg = flip f と書く
  • 高次元同時分布
    • 同時分布があってそのパラメタを推定したいが、データの取られ方が部分的(射影空間観測)であるような場合には
    • p::theta1->theta2->theta3->...-> xa->xb->...->xk -> Doubleのように、分布パラメタと観測ベクトルの成分とをカリー化して渡すような同時分布になるが、
    • ここで、観測データとは、あるthetai(の集合)とあるxj(の集合)とが与えられることであって、
    • 分布推定とは、それらを使ってpを推定する作業となる