给定一个函数,该函数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
产生:
类型是Product Distribution,不再统一。
转换为 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 其中 fx1(x1) = 1 on 0 <= 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
在我们的例子中简化为
1/y2 在 0 <= y1/y2 <= 1 和 0 <= y2 <= 1 范围内。
最后,为了得到 fy1(y1),我们对不需要的变量 y2 上的联合分布进行积分,注意保持在正确的范围 y1/y2 <= 1 或 y1 <= y2 因为 y2 >= 0。
fy1(y1) = (1/y2)dy2 = -ln(y1) 在 0 <= y1 <= 1 范围内从 y1 到 1 的积分。
请注意,在这两种情况下,乘积的分布都偏向于较小的值,因为分数 (0 <= x <= 1) 乘以分数是较小的分数。