はじめに
久々に計算用紙的な記事を書きます。
ちょっと前の記事で、標準正規分布の確率密度関数を使って累積分布関数を求める方法について書きました。
上記の記事を書いた後で、標準正規分布に従う乱数の生成方法を調べてみたところ、Ziggurat法というものにたどり着きました。
Ziggurat法自体の説明や実装については上記のWikipediaのリンクを始めとして、いろいろなところで行われています(MATLAB等でも実装されているようです。)あることと、本サイトの管理人たるpandaが付け足せることはあまりないので、詳細についてはそちら(「参考文献」の節参照。)をご覧いただければと思います。
Ziggurat法では乱数生成の最初の手順において、面積が相等しい長方形を使って単調減少な確率密度関数
しかし、最も
上記の「layer 0」及び長方形群の中からランダムに1個の領域を選ぶのがZiggurat法による乱数生成の最初の手順となります。
しかしながら、単調減少な確率密度関数が標準正規分布の確率密度関数(の右半分)
であり、さらに「layer 0」が選ばれてしまった場合でかつ、その後の手順で
その筋の論文等に割とよく載っているtailの計算方法
参考文献[2]を始めとした論文や実装を説明した文献などに割とよく載っているtailの計算方法は以下の通りです。
を一様分布の乱数として生成する。 を計算し、
(2)
であれば を として返す。( )が成り立たない場合には、2 を新たに生成するところからやり直す。
でも、これってなんでそうなるのかって上記の説明だけでは一撃ではわからないですよね?
少なくとも本サイトの管理人たるpandaは最初は理解できませんでした。(´・ω・`)
見た目が極めて簡単な式ですので、「今日中にコードを書け!!」とか言われたらなんでそうなるのかなんてことは考えずにコードを書いてしまうところです。
そこで、なんでそうなるのか調べてみました。
まず、ぐぐります。
スポンサーリンク
まず手始めに、Google先生に何回かお伺いを立ててみたところ、参考文献[3]及び[4]が出てきました([3]はいろいろなところで引用されているTechnometricsの論文の下書きっぽいテクニカルレポートです)。参考文献[4]については、とりあえず必要なところが記述されているPDFファイルだけをダウンロードすることにします。
なお、本全体に興味のある方は↓をご参照ください。
[3]は3ページで、[4]は2通りの方法が3ページ足らずでそれぞれさらっと書いてありますが、さらっと書かれすぎていてわかりにくいので、[4]に書いてある2通りの方法に沿って試しに計算してみることにします。
標準正規分布の確率密度関数のtailの部分の乱数は以下のような手順で生成します。
において でそれ以外の では となり、かつ となるような関数 を考えます。-
(3)
となるような定数 を求めます。 - 確率密度関数
を考えてそれに従う乱数 を生成します。 が標準正規分布に従う乱数として採用可能ならその数を採用し、そうでなければ再度 を生成するという手順を繰り返します(参考文献[3]では”rejection technique”と書かれている方法です)。
その1: のようなタイプの式を使って乱数を生成する方法
ところで、
(
となります。
ここで、(
と計算できるので、確率密度関数として使えそうです。
そこで、
とおいて
となって、(
さらに、区間
(
と変形できます。
ものすごくシンプルな式になりましたね。
その2: 評価式の不等式の一方の辺が のようなタイプの式に変形できる式を使って乱数を生成する方法
次に、
ここで、(
と計算できます。前節と違って計算結果は1にはなりませんでしたが、正規化した関数(
は、確率密度関数として使えそうです。
そこで、
とおくと、
になります。
(
両辺の対数をとると…
(
これは、
何とか(
おまけ:切断レイリー分布
ところで、(
(
そこで、(
(
まとめ
標準正規分布に従う乱数を生成する際にこの記事で取り扱う計算が行われる確率は実は非常に小さい(標準正規分布,
ただ、確率密度関数の計算を扱う分野ではよくあることなのかどうかわかりませんが、それまでの式を定数倍した式が説明なしにいきなり登場したり、「〜は
正直なところ、最初はあまりにも理解できなかったので、この記事はボツにしようかとも思ってました。(´・ω・`)
この記事を書くにあたり、国内外のWebサイトの記述を調べてみましたが、見た目は簡単なせいか(
また、ここまでに書いた計算の方法または理解が正しいのかどうかについての保証はできませんが、何かの際の参考にしていだけると幸いです。
この記事は以上です。
References / 参考文献
- [1] Ziggurat method
- [2] George Marsaglia; Wai Wan Tsang (2000). “The Ziggurat Method for Generating Random Variables”. Journal of Statistical Software. 5 (8).
- [3] George Marsaglia; generating a variable from the tail of the normal distribution
- [4] Luc Devroye; Non-Uniform Random Variate Generation pp.380-382