人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

重点サンプリング (4)

重点サンプリング (3)(2014/10/2)のつづき。今回は、Rによるモンテカルロ法入門のテキストの例題をPythonで解いてみたい。まずは、練習問題3.4から。

fを標準正規分布 N(0,1) とし、h(x)exp(-(x-3)^2/2)+exp(-(x-6)^2/2) として期待値 \mathbb{E}_{f} [ h(X) ] を計算せよ。

という問題。

  • 標準正規分布 N(0,1) からサンプリングする通常のモンテカルロ積分
  • 重点関数として一様分布 U(0,3) を使ったモンテカルロ積分

の収束性を比較してみたい。

(注) テキストでは、重点関数として一様分布 U(-8,-1) を使えと書いてあるが、この設定だとあとで見るようにサンプリングの効率が極端に悪く、正しい積分が得られないようだ。

f:id:aidiary:20141011100836p:plain

青色が標準正規分布 f(x)、緑色が任意分布の h(x)、赤色が被積分関数 h(x)f(x)、水色が重点関数 g(x) となっている。被積分関数のところを重点的に覆えるように重点関数を選んでみた。今まで (1)~(3) の記事を通して重点サンプリングの手順はさんざん書いてきたので今回はスクリプトと結果だけ。

実行結果は、

scipy.integrate: 0.0746157703288
normal monte carlo integrationi: 0.0731957831939
importance sampling: 0.0732103112973

どちらも同じくらいの値に収束している。ただ、ランダム性が入ってくるため実行するたびに結果は変わってしまう。収束性のグラフも表示してみよう。

f:id:aidiary:20141011100839p:plain

この結果を見てわかるように重点サンプリングを使った方が収束が早いことが確認できる。ただ、この例題の結果を見ていて気になったけど、サンプル数を10万くらいまで多くしても結局のところモンテカルロ積分でscipy.integrateの値に有効数字3桁で一致する結果がなかなか得られなかった。こんなものなのかな?

ちなみにテキストに書かれているように一様分布 U(-8,-1) で実行した結果は下のようになった。重点サンプリングでは、一様分布から得られたサンプルxを用いて計算したh(x)の結果がほぼ0になるため積分の値も0になってしまう。何か勘違いしているかな?テキストが誤りなのかな?ご存知の方がいたら教えてください。

f:id:aidiary:20141011100841p:plain f:id:aidiary:20141011100843p:plain