サンプリング法メモ
はじめに
ある分布に従った乱数を生成したいことがよくあったりする(一様分布に従う一様乱数や正規分布に従う正規乱数など)。
ベイズ統計学なんかだと、自然共役事前分布が使えないような複雑な分布の場合にMCMCで分布のサンプリングをして計算したりするので、結構使う場面は多い(はず)。
ちょっと調べてみたので、メモ。(基本、PRML第11章のはなし)
一様分布からの(疑似)乱数生成
一様乱数の生成の仕方について。少し。
線形合同法
- X_{n+1} = (A*X_{n}+B) mod Mという形式で乱数Xを次々に生成していく方法
- C言語のライブラリで実装されているrand関数
- 多次元にすると均等に分布しなかったり、下位ビットがランダムじゃなかったり、といろいろ問題がある
xorshift
http://ja.wikipedia.org/wiki/Xorshift
- xor演算とビットシフトだけで生成していく方法
- 線形合同法よりも長周期でCのrand()を使うぐらいならこっちを使った方がよさそう(コードも短い)
メルセンヌ・ツイスター
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
- これまでの疑似乱数生成アルゴリズムの欠点を克服した現状最強の疑似乱数生成の方法
- 使えるならば使った方が良いと思うけど、欠点がないわけではないので、使うときは注意
サンプリング法
一様分布以外の(連続型の)確率分布からサンプリング(標本抽出)を行う方法について。
以降、[0,1]の一様乱数の生成アルゴリズムは与えられていると仮定。
逆関数法
Marsaglia法(Box-Mullar法,Ziggurat法)
- 極座標を使った正規乱数の生成方法(?)
- 指数分布に従う乱数でも出てくるのでMarsagliaさんがいろいろがんばったんだと思う
階段関数の近似によるサンプリング
http://www.sci.kagoshima-u.ac.jp/~ebsa/wakimoto01/pdf/ch04-04.pdf
棄却サンプリング
- 単純で標準的ではない比較的複雑な分布p(z)のサンプリングをしたいとき、zのすべての値についてk*q(z)>=p~(z)となる簡単にサンプリングできる分布q(z)を用意し、乱数z_0をq(z)から生成し、乱数u_0を[0,k*q(z_0)]の一様分布から生成する。もし、u_0>p~(z_0)なら破棄し、そうでないならu_0を乱数として採用する
- kは定数
- p~(z)は正規化された分布。p(z) = 1/Z p~(z), (Zは正規化定数)
- 要は、分布を覆うような分布(提案分布)を使って、提案分布から生成した乱数の採用・不採用を決める
- 提案分布の選択の仕方によっては、棄却するものが多くなったりして無駄が多い
適応的棄却サンプリング
- 棄却サンプリングにおいて元の分布を覆うような提案分布(包絡分布)を決めるのは結構難しい
- 分布p(z)の観測値に基づいてその場で包絡関数を構築していく方法
- 導関数の評価を行う方法、Metropolis-Hastingsステップをおく方法(適応的棄却Metropolisサンプリング)、などがある
- 上記同様、棄却するものが多くなったり、高次元には適さないなどの問題がある
重点サンプリング
- この方法は、直接サンプリングが難しい分布場合にある関数の期待値を求める方法
- なので、乱数生成という枠組みではない
- 棄却サンプリングのように提案分布を利用して、重要度重みを考慮したすべてのサンプリング値から求める
Sampling-Importance-Resampling(SIR)
- 提案分布q(z)や定数kの選び方は難しいので、重点サンプリングの重みを活用する
- 2段階により構成され、1段階目では提案分布q(z)からL個のサンプルを抽出し、2段階目で各サンプルの重みを求め、最後に、重みを確率とするL個の離散分布からサンプリングする方法
メトロポリス法
- Markov chain(一つ前の状態のみに依存する確率過程) Monte Carlo(乱数を使って数学的問題を解く)法の一つ
- マルコフ連鎖的棄却サンプリング
- 対称な提案分布q(x)を定め、現在x_tにいるときサンプル候補x'を提案分布q(x)から生成する、もし一様乱数uがmin(1,p~(x')/p~(x_t) )>uならばx_{t+1}=x'とする、そうでないならばx'を破棄し、x_{t+1}=x_tとし提案分布q(x|x_{t+1})からサンプル候補を生成し、繰り返す
ギブスサンプリング
スライスサンプリング
- メトロポリス法はステップサイズに対して敏感
- 分布の特徴に応じて自動的に調整する方法