どうやって分布からパラメタを推定する?KernelABCはいかが?
目次
この記事で書くこと
- パラメタ推定タスクの話
- ABC(approximate Bayesian computation)の話
- Kernel ABCのpythonコード
そもそもパラメタ推定とは?
すっごい簡単に書くと「予測モデルのパラメタを推定すること」です。
で、誰がそんなことしたいの??予測モデルって何??何に対して推定?教師有り学習と何が違うの??などなど、いろんな疑問が湧いてきそうです(初見のぼくは少なくともそうだった)
ひとつづつ、確認していきましょう。
誰がパラメタ推定したい?予測モデルって何?
パラメタ推定をさかんにやっている分野は主にシュミレータ分野です。気候シュミレーションとか生産工程シュミレーションとか、がよく引き合いに出されます。
なので、パラメタ推定したい人はシュミレーション分野の研究してる人。シュミレーションを使う人。ということになります。
予測モデルとは、シュミレーションのことです。シュミレーションは、パラメタを受け取って、値を出力する機械と言えます。なので、これは関数と表現できます。
パラメタ推定は非線形な挙動をする関数 OR パラメタ数が多い関数に対して有効(だとぼくは思ってます)。
もし、関数が線形 AND パラメタ数が少ないならば、回帰で解けば十分です。
気候シュミレーションや生産管理シュミレーションはとてもじゃないけど、線形な関数とは思えません。
何に対してパラメタ推定する?
パラメタ推定タスクの枠組みを図に書き出してみました。
青枠が、いま利用可能、つまり、手に持っているものです。
緑枠が、得たい値です。

観測データは何らかの現象で発生しています。その現象を関数とみなすことができるでしょう。現象が関数ならば、関数はパラメタを持っているはずです。
上の図でもう少しパラメタ推定タスクを定義してみましょう。
シュミレーション関数(青枠)と候補のパラメタとその出力値(青枠)と観測値(青枠)の3つの道具を使い、そして真のパラメタ(緑枠)を推定するタスク。真パラメタとは、観測値(青枠)を生成した(はず)のパラメタを意味する。
ABC(approximate Bayesian computation)
ABCはパラメタ推定の1手法です。こいつの歴史は古く、1997年のTavareの論文が初出です。
ABCのアイディアは極めて単純です。ABCの気分を書くとこうなります。
まずパラメタをなんでもいいからシュミレーション関数につっこんでみるんや。すると、シュミレーション関数から値が出るやろ?それを観測データと比較すればええねん。シュミレーション関数の出力と観測データが十分に似てれば、パラメタは妥当ってことやー
ね、極めて単純なアイディアでしょ?
この説明をもう少し定義してみましょう。
まずパラメタをなんでもいいからシュミレーション関数につっこんでみるんや(事前分布の設定)。すると、シュミレーション関数から値が出るやろ?(シュミレーション関数の実行)それを観測データと比較すればええねん。(観測データとシュミレーションデータの距離計算)シュミレーション関数の出力と観測データが十分に似てれば(距離のしきい値)、パラメタは妥当ってことやー
アイディアが単純なだけに問題も多いです。例えば問題をあげると、こんな問題が指摘されてます。
なんでもパラメタを・・・ってそんないい加減な。収束までに時間かかるだろうに(パラメタ生成する事前分布の選び方問題 &計算量の問題)
パラメタが高次元空間だったらどうすんの?どっちの方向に勾配を転がす気?(探索問題)
シュミレーション関数と観測データの比較をするって言うけどさ、出力が高次元空間だったらどうすんの?ユークリッド距離じゃ不足と思うけど(距離関数の計測方法の問題)
などなど・・・素朴なABCには問題が山積みです、実用に使うためには。
そこでカーネルですよ
よく言われてることですが、カーネル空間では非線形っぽいデータ構造を線形っぽく扱えます。例えば、SVMの説明では下のような図がよく掲載されますよね。

少し思い返すと、SVMをはじめて触れたときは意味不明な話でした。なんだかカーネルとかいうわけのわからないやつを使うと、線形分離できる空間になるらしい、、、というのが当時の精一杯の理解でした(いや、今も大して理解レベルは変わってないかも)
この「カーネル空間に移せば(写像すれば)うまく行く」って話は他のアルゴリズムにも言えることです。PCAやら線形回帰やら。
じゃあ、ABCもカーネル空間で解いたらいいんじゃね?というのが”Kernel Approximate Bayesian Computation for Population Genetic Inferences, 2013″です。
細かい説明をできないのですが、すんげー雑にいうと、こうなります。「」みたいな気持ちです。
なんとなく用意したパラメタがあるやろ。パラメタをカーネル空間に移すんや(写像)。んで、カーネル空間上のパラメタに重みをくっつけててやるんや。重みが真のパラメタ方向に位置をずらしてくれるんやでー
この操作を端的に説明してるのが、以下のスライドの50ページ目です。
E^hatが推定されたパラメタになります。びっくりするくらいに線形和で表現されてます。カーネル空間すごいー(棒読み)
自分の理解のために実装してみました。
実行してみると、こうなります。なかなか近い値を推定していんじゃないでしょうか。
1 2 |
******************** True-Theta: [2.5, 2.6, 4.5], Estimated-theta: [2.32791943 2.50551713 4.33318344], Sqrt-error = 0.2576169614198136 |
ディスカッション
コメント一覧
まだ、コメントがありません