random()
0 と 1 の間で一様に分散された浮動小数点値を返す関数があるとします。
関数の分布のタイプは何random() * random()
ですか?
random()
0 と 1 の間で一様に分散された浮動小数点値を返す関数があるとします。
関数の分布のタイプは何random() * random()
ですか?
# test.py
import numpy as np
import matplotlib.pyplot as plt
N = 10**6
plt.hist(np.random.uniform(size=N) * np.random.uniform(size=N), bins=50, normed=True)
plt.show()
実行するとpython test.py
次が生成されます。
変換は y = x*x です。x は、0 <=x <= 1 の範囲で確率分布関数 fx(x) = 1 を持ちます。x の累積分布関数は、同じ範囲で Fx(x) = x です。
y の CDF は Fy(y <= Y) = Fx(sqrt(Y)) = sqrt(Y)、0 <= Y <= 1 です。
ここで微分して、同じ範囲で fy(y) = 1/(2*sqrt(y)) を取得します。
編集:
上記の解決策は、「random() * random()」が各描画に依存して同じ値を使用することを前提としています。代わりに、乗算された値を互いに独立させたい場合、数学はより複雑になりますが、それでも扱いやすいです。
今みましょう
y1 = x1*x2 ここで、0 <= x1 <= 1 では fx1(x1) = 1 であり、x2 についても同様です。
x1 と x2 の間の独立性を仮定すると、結合 PDF は
fx1x2(x1,x2) = fx1(x1)*fx2(x2)。
追加の変数 y2 を導入して、2 変数ジョイント PDF の変換を処理します。うまく計算するには、y2 = x2 とします。
だから私たちのシステムは
g1(x1,x2) = x1*x2
g2(x1,x2) = x2
より単純な場合と同様に、y1 と y2 の両方を解くことにより、関数を反転する必要があります。
h2(y1,y2) = x2 (= y2)
h1(y1,y2) = y1/x2 = y1/y2
ヤコビアンが必要になります
J = (pg1/px1)(pg2/px2) - (pg1/px2)(pg2/x1)
ここで、「p」は偏導関数です。
だから私たちの場合
J = (x2)(1) - (x1)(0) = x2。
変換式 (イントロ微積分ベースの確率テキストから) は次のとおりです。
fy1y2(y1,y2) = fx1x2(x1,x2)/J
私たちの場合、これは次のように単純化されます
範囲 0 <= y1/y2 <= 1 および 0 <= y2 <= 1 の 1/y2。
最後に、fy1(y1) を取得するために、y2 >= 0 であるため、正しい範囲 y1/y2 <= 1 または y1 <= y2 に留まるように注意しながら、不要な変数 y2 の結合分布を統合します。
fy1(y1) = 範囲 0 <= y1 <= 1 での (1/y2)dy2 = -ln(y1) の y1 から 1 までの積分。
どちらの場合も、分数 (0 <= x <= 1) 倍の分数はより小さい分数であるため、積の分布はより小さい値を優先して重み付けされることに注意してください。