疑似乱数サンプリング
疑似乱数サンプリング (pseudo-random number sampling) は与えられた確率分布に従う擬似乱数を生成する数値的手法。一般に一様乱数
Table of Contents
- サンプリングアルゴリズム
- 分布ごとの生成方法
- 参考文献
サンプリングアルゴリズム
逆関数法
ある確率密度関数
ここで累積分布関数は以下の不定積分で表される。
確率密度関数
ただし、累積分布関数の逆関数を解析的に求めることは難しい場合が多く、また必ずしも高速な式が得られるとは限らない。逆関数を解析的に求めることのできる累積分布関数
| 指数分布 | |
| ワイブル分布 | |
| ロジスティック分布 | |
| コーシー分布 | |
棄却サンプリング法
棄却サンプリング (rejection sampling) はモンテカルロ法を用いて分布
acceptance-rejection モンテカルロ法
分布
一様乱数
を分布 の定義域 で決定する。 一様乱数
を分布 の値域 で決定する
であれば を に従う乱数として採用する。そうでなければ棄却しやり直す。
この方法は (理論上) 任意の分布に従う乱数を生成することができる。しかし、定義域の一方が
比較関数を使った方法
ここでモンテカルロ法の棄却数を効率的に削減するために分布
比較関数の種類は任意で良いが、前述の逆変換法を使用するため不定積分と逆関数が解析的に求められる関数を選ぶ必要がある。
比較関数
一様乱数
を の範囲で生成する。 乱数の候補
を求める。 一様乱数
を の範囲で生成する。
であれば を に従う乱数として採用する。そうでなければ棄却しやり直す。
3-4 は
棄却される点の割合は比較関数
比較関数を使った棄却サンプリングは
比較関数を使った棄却サンプリングは 1 度の算出に 2 つの一様乱数と
- 棄却の上限回数やタイムアウトを設けてエラーにする。
- 事前に計算してプールする。
CPU コア数に余裕があれば棄却を見込んで 2-3 スレッドで投機的に実行しても良いだろう。
def rejection(f:(Double)=>Double, g:(Double)=>Double, gcinv:(Double)=>Double, r:Double):Double = {
@tailrec
def _rand():Double = {
val x = gcinv(math.random() * r)
val y = math.random() * g(x)
if(y >= f(x)) _rand() else x
}
_rand()
}
適応 Squeezed 棄却サンプリング
適応絞り込み棄却サンプリング (adaptive squeezed rejection sampling) は棄却サンプリングでの効率を高めるために目標分布と提案分布の下に絞り込み関数 (squeeze function) を導入する。この関数によりサンプルが棄却される確率を減らし計算効率が向上する。適応スクイーズド棄却サンプリングは、目的分布から点を抽出する方法であり、スクイーズド棄却サンプリングのための自動エンベロープ生成戦略を利用することで、棄却サンプリングよりも一歩進んだ方法である。スクイージング棄却サンプリングは、単に提案密度を用いてサンプリングする方法で、棄却サンプリングと似ている(Cheng et al.2015)。ただし、この場合、1 つではなく 2 つの提案分布が使われる。棄却サンプリングは、スクイーズ棄却サンプリングの欠点を補うために改良されたサンプリング手法である。
マルコフ連鎖モンテカルロ法
分布ごとの生成方法
指数乱数
指数分布 (exponential distribution) は連続する 2 つのイベント間の時間をモデル化するために使われる連続確率分布である。ランダムに起きる事故や故障のある発生時刻を
指数分布は正のパラメータ
指数分布の累積分布関数は逆関数を求めることができる。
また x から指数分布に従う乱数を得るコードは次のように書くことができる。
def exponentialInverseCDF(lambda:Double)(x:Double):Double = {
- math.log(x) / lambda
}
以下のグラフは
正規乱数 (ガウス乱数)
標準正規分布の累積分布逆関数は解析的に求めることはできないが、いくつかの近似方が提案されている。例えば以下の山内の近似では相対誤差が
def normalInverseCDF(x:Double):Double = {
val z = - math.log(4 * x * (1 - x))
val w = math.sqrt(z * (2.0611786 - 5.7262204 / (z + 11.640595)))
if(x < 0.5) -w else w
}
以下のグラフは定義域 normalInverseCDF() のプロットと、一様乱数から得られた正規乱数のヒストグラムである。
そのほかにはボックス-ミュラー法が有名。
ガンマ乱数
ポアソン乱数
二項乱数
参考文献
- Pseudo-random number sampling (Wikipedia)
- 逆関数法 (Wikipedia)
- John von Neumann. Various techniques used in connection with random digits. Collected Works, 1963, 5: 768-770.
