How does the product of uniform variates distribute?

id:practicalschemeさんの珠玉のエントリ、なんでも継続は以下のような一説から始まります。

プログラミングの世界の概念には、禅の公案のようなものがある。 それを説明する文章はほんの一文なのに、最初に目にする時、 その文は全く意味をなさない、暗号のように感じられる。 だがひとたびその概念を理解すると、 その概念の説明は確かにその一文で説明されているのがわかるのだ。

確率の世界でも同じようなものを感じることがあります。直感ではとても受け入れられない結果になることがある。しかし、一回理解するとすんなり受け入れることができるようになってしまう...

[0, 1]の範囲で一様に分布する二つの乱数の積が一様に分布しないこともこのような事象の一つです。以下は二つの一様乱数の積を10000回生成し、相対度数分布として表したものです。

乱数生成器を伴った議論は乱数生成器そのものの偏りや精度の話に発散してしまいがちです。そのためこのエントリでは理想的な一様乱数を伴った連続型確率で考えてみます。同時確立変数Xiの積から確率密度を導出するにはデルタ関数積分を用いますが、yutakashinoさんが解説していますので、異なるアプローチを取ってみることにします。

さて、二つの一様乱数の積の分布は条件付き確率を使って比較的簡単に求めることができます。Xを一つ目の一様乱数がxとなる確率変数、Yをxと二つ目の一様乱数の積がyとなる確率変数とします。すると、Xがxである場合にYがyとなる条件付き確率密度関数fY(y | X = x)は以下のように表すことができます。

この式からX、Yがそれぞれx、yとなる同時確率密度関数fX, Y(x, y)を以下のように求めることができます。

つまり、Yがyとなる確率密度関数fY(y)は確率変数X = xが起こりうる全ての範囲で積分したものとなります。

さて、確率密度関数fX(x)を考えてみましょう。fX(x)は一つ目の確立密度関数であるため事前確率を考慮する必要がありません。そのため、[0, 1]の範囲で一様に分布する乱数と等しく分布します。

この分布は以下のようになります。

では、条件付き確率密度関数fY(y | X = x)を考えてみましょう。Yはxと二つ目の一様乱数との積がyとなる確率変数と定義したのでした。そのため、fY(y | X = x)の分布は事前確率であるxの値に依存します。確率変数Xがxであった場合にyがxより大きな値を取ることはなく、[0, x]の間で一様に分布する確率密度関数となります。

例えば、Xが0.75であった場合、fY(y | X = 0.75)は[0, 0.75]の間で以下のように分布します。

勿論、Xが1であった場合、fY(y | X = 1)は[0, 1]の間で分布します。

さて、条件付き確率密度関数fY(y | X = x)から確率密度関数fY(y)を導出するには確率変数X = xが起こりうる全ての範囲で積分を取ればよいのでした。

xの起こる範囲を考えると負の無限大から正の無限大まで積分を取る必要がないことが分かります。また、yがxより大きな値を取ることもないので、yより小さいxはfY(y)に寄与しません。つまり、積分で考慮すべき変数の範囲は以下となります。

積分範囲をDと置いて考えてみましょう。

私たちが興味を持っている確率密度fY(y)はyの関数です。そのため積分範囲Dを「fY(y)を算出するためにどの範囲のxを積分すればよいか」を表すように置き換えてしまいましょう。

つまり、確率密度関数fY(y)を求めるためには[y, 1]の範囲でxの積分を取ればよいのです。

ではこの積分範囲Dを用いて積分を計算してみましょう。

yは常に正であるので絶対値記号を外すことができます。

ついにfY(y)を導出することができました。二つの理想的な一様乱数の積の確率密度関数は-log yとなることが分かりました。

冒頭で掲載したMersenne Twisterを用いたシミュレーション結果は理論通りに分布したものだったのでした。

線形合同法で生成した乱数を用いたシミュレーション結果も理論通り分布します。


まとめ

計算機を用いたシミュレーションの議論は乱数生成器の偏りや誤差等に議論が発散してしまいがちですが、乱数生成器が原因でないことが多いようです。一先ず理想的な一様乱数が取得できることを仮定して分布を考えるとよいでしょう。

元の記事はこちらです。

yutakashinoさんによるUniform Product Distributionの解説。大変丁寧なエントリです。このエントリを記載するきっかけとなりました。

atsさんは元の記事を要約して日本語で紹介してくださっています。

条件付き確率密度関数に関しては以下のページを参考にしました。

一様分布、RNGに関しては以下のページを参考にしました。

相対度数分布については以下のページを参考にしました。

確率、統計に関する作図を行うときはいつも以下のページの秀逸な作図を参考にしています。

積分範囲の作図には以下を参考にさせていただきました。重積分をとても分かりやすく説明しています。

また、このエントリを記載するにあたり、以下の書籍を参考にしました。

確率と計算 ―乱択アルゴリズムと確率的解析―

確率と計算 ―乱択アルゴリズムと確率的解析―

プログラミングのための確率統計

プログラミングのための確率統計

計算機シミュレーションのための確率分布乱数生成法

計算機シミュレーションのための確率分布乱数生成法

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)