機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

棄却サンプリングでモンテカルロ積分

棄却サンプリングによって、様々な形状の分布からサンプリングできるようになったのだから、モンテカルロ積分を使えばその分布も積分もできるようになるはず。ということで試してみました。が、勘違いをしていてうまくいかなかったのですが、せっかくなので記事にします。

今回、サンプリングしたい分布を


\displaystyle p(x) = \frac{1}{3^x} \tag{1}

とし、提案分布q(x)\lambda = 1の指数分布、


\displaystyle q(x) = \exp(-x) \tag{2}

とします。それぞれの関係は下のグラフのようになっており、常にq(x) \ge p(x)ですから棄却サンプリングによってサンプリングすることができます。 f:id:opabinia2:20180331190832p:plain

さて、棄却サンプリングを使って


\displaystyle \int_2^{\infty}p(x)dx  \tag{3}

を求めてみます。コードは今まで書いた組み合わせで簡単、、、のはずが、どれだけサンプル数を増やしても理論値と微妙にズレている。相当悩んだ挙げ句、積分されているのは正規化係数がかかった関数であり、式(1)とイコールではない、ということにようやく気付きました。

つまり、指数分布の区間[0,\infty]で積分して1になるような正規化係数をかけた、


\displaystyle p(x) = \frac{1}{0.91024\times3^x} \tag{4}

からサンプリングしているのだから、これをモンテカルロ積分しても式(1)の積分値とは一致しません。理解するまで随分時間をかけてしまいました。とほほ。