My online activities
検索
以前の記事
2013年 02月 2013年 01月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 11月 2009年 10月 2009年 09月 2009年 08月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 10月 2007年 09月 2007年 08月 2007年 07月 2007年 06月 2007年 05月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 12月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 2006年 06月 2006年 05月 2006年 04月 2006年 03月 2006年 02月 2006年 01月 2005年 12月 2005年 11月 2005年 10月 2005年 09月 2005年 08月 2005年 07月 2005年 06月 2005年 05月 2005年 04月 2005年 03月 2005年 02月 2005年 01月 2004年 12月 2004年 11月 2004年 10月 2004年 09月 2004年 08月 2004年 07月 2001年 01月 カテゴリ
全体 Math Science Book Log Misc Business Music IT Food Topic Movie Art Stat Politics Muttering Off Topic 未分類 ブログパーツ
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧
|
2011年 06月 14日
Twitterのタイムラインに最近も出ていたのだが、1年位前にRコミュニティで流行ったこれは面白い。
Understanding “randomness” http://stackoverflow.com/questions/3956478/understanding-randomness I can't get my head around this, which is more random? これは質問者は"more random"と言っているように、この質問の時点では確率変数の概念を全く理解していなくて、その意味で教科書的というか額に入れて飾りたいようなナイスな間違えの一つである。一般的に普通のプログラム言語のrand()は擬似一様乱数を生成する関数であるのだが、一様乱数を二つ掛けたらといって、もっとスゴイ一様乱数になるわけではない。 この質問のすぐ下にそれなりの模範回答がある。ただ、その回答は回答者のオリジナルではなく、Eric W. Weissteinの"Wolfram Math Worldの"Uniform Product Distribution"に添付されているMathematicaのノートブックを孫引きしているのだ。 http://mathworld.wolfram.com/UniformProductDistribution.html しかし、結構この説明は明快なので、同じような説明をRでやってみることにする。まずは0 < x < 1の一様乱数をプロットしてヒストグラム描くことにする。ここで擬似一様乱数はrunif()によって与えられる。あと蛇足だが、Rのrunif()は最初からMersenne-Twisterで乱数を生成するので、それなりに信頼のおける擬似乱数生成をデフォルトで行う。 この擬似一様乱数で生成された確率変数のヒストグラムをみると、当たり前だが「一様乱数」の名前通り目で見て一様な分布になっている。 > u1 <- runif(10000) つぎに、一様乱数の積をとったもの、つまりStackOverflowの質問の rand() * rand()について擬似乱数から生成した分布を見てみる。 > u2 <- runif(10000) * runif(10000) このヒストグラムを見ても、一様な分布ではないことがわかる。実はこの分布こそが、さきほどのWolfram MathWorldにある"Uniform Product Distribution"なのである。まずは、n=2のときのUniform Product Distributionとして、- log(y)という関数を上の一様乱数の積のヒストグラムに重ねて書いてみる。 > y <- seq(0, 1, .01) これをみると明らかなのだが、一様乱数の積の密度分布は- log(x)になるのだ。一様分布ではなく。一般的には一様な乱数をとる確率変数X_1X_2...X_nの積の密度分布の関数型は以下のようになる。 n = 2にすると-log(x)になる。この一様確率変数の積がどうしてこのような形になるのかというのは、Wolfram MathWorldにあるようにデルタ関数の積分を考えればいいのだが、ちゃんと議論するには結構大変なので、ここでは割愛する。少し検索してみると、この一様確率変数の積の密度分布について、最初に定式化を与えた記述は以下の本にあるそうだ。 Springer, M.D., 1979. The Algebra of Random Variables. Wiley, New York また、この密度分布の関数型をより一般的な形にしたものが、産能大の石原辰雄氏によって導かれていて、もしかしたらこちらの数学的帰納法で示した証明のほうが簡単かもしれない。 「独立で非同一な分布に従う一様確率変数の和および積の分布」 http://ci.nii.ac.jp/naid/110001878196 更には、以下のペーパーは別の証明を与えている。 Dettmann & Georgiou "Product of n independent Uniform Random Variables" http://www.maths.bris.ac.uk/~macpd/georgiou/ProductRVs%20revised.pdf 上記の例は確率変数の「積」だけれど、「和」はどうかというと、独立な一様乱数をもつ確率変数の和をたくさん重ね合わせると中心極限定理によりその重ねあわせた分布は正規分布になる。というか、別に一様乱数の確率変数でなくても、重ね合わせる確率変数の数が十分大きく、独立かつほぼ同一の分布なら正規分布になる、というのが中心極限定理の直感的理解だ。以下は一様乱数を確率密度分布とする5つの独立な確率変数の和の例。 > u3 <- runif(n) + runif(n) + runif(n) + runif(n) + runif(n) 実線の曲線が正規分布であるが、この5つ程度の確率変数の和であっても中心極限定理の雰囲気は味わうことができると思う。 さてこの議論の着地点であるが、実は一様乱数から任意の確率変数を生成する「逆変換法」と非常に密接に関わっているのだ。今の時代は数学ソフトウェアや統計計算環境が充実しているので、主要な確率密度分布については予め組み込みであり、ほとんどの場合はあまり余計な心配をしなくていい。しかし、その組み込み関数に存在しない確率密度分布の確率変数を生成したいというときに、「逆変換法」を用いると一様乱数をネタにして必要な確率変数を生成することができるのだ。 この「一様乱数からの確率変数の生成」ということから考えると、StackOverFlowの質問にある"rand() * rand()"というのはある確率密度(この場合-log(x))を持ったあらたな確率変数を生成しているのであって、「もっとすごい一様乱数」を生成しているのではないということなのだ。 長くなったので、このあとの解説は次回に回す。
by yutakashino
| 2011-06-14 23:07
| Stat
|
ファン申請 |
||