gpt4 book ai didi

python - 将 random.random uniform 转换为指数分布不会产生正确的结果

转载 作者:行者123 更新时间:2023-12-04 15:14:02 24 4
gpt4 key购买 nike

我正在尝试生成一个合成地震数据库,其中震级($M$)在 $[M, M+\delta_M]$ 范围内的事件数量($N$)如下:
$\log_{10}(N) = a - bM$
其中 $a$ 和 $b$ 是常量。

我正在尝试使用 random 模块在 Python 中执行此操作。我知道我可以(或者至少我认为我可以 - 因为我还没有尝试过)使用 random.expovariate 但我认为我可以使用 random.random转换如:

-math.log10(random.random()))

我对 2,000,000 个样本运行了此程序,然后将其分装到 0.1 个箱子中并在对数刻度上绘制。

enter image description here

红线显示了用于生成合成样本的理论分布。

我不担心 x=4.5 以上的变化。这是由于点数少和自然随机性。我要问的是 x=0 附近的点的非常小的(在这个尺度上)变化。我根据理论(蓝点)绘制了合成点的变化:

diff between observed and theory

随着 x 的减少,事件的数量呈指数增加,因此与理论值的差异应该减少——而不是增加。而x=0处的点是相反意义。

为了尝试找出我的问题所在,我编写了代码,以非常精细的步骤生成从 0 到 1 的数字。然后每个数字都经过上面提到的函数。结果(上图中的蓝点)是纯线性的,与理论值完全吻合。这说明我的转换函数和代码没问题。

所以上图中 twp 点集之间的唯一区别是,蓝色点是通过调用随机函数 2,000,000 次生成的(结果然后转换为幅度并合并),而对于红色点,我已经在 0 和 1 之间采取了 2,000,000 步(然后将结果转换为大小并使用相同的代码装箱)。

所以我认为这在某种程度上与随机数生成器有关?

如有指点,将不胜感激。谢谢。

[添加]按照@Arty 的建议将调用从 random.random 更改为 random.uniform(0,1) 并且错误现在对称分布并且具有预期的幅度。已将 +- 1 标准偏差添加到图中。

deviation from expected +- 1 standard deviation

显然 random()uniform(0,1) 做的事情略有不同。


我使用 random.randomrandom.uniform(0,1)np.random.random 缩减代码并计算合成数据code> 和 np.random.uniform(0, 1) 2,000,000 点。

对结果进行分箱并绘制观察到的数字和预期数字之间的差异(如下)。

enter image description here

还添加了 +-1 标准偏差限制。这些数字都是对称分布的,并且大小正确,表明所有随机生成器都工作正常。

我的结论是,在更改/优化代码的过程中,我引入了一个问题,但现在已经消失了。我非常想找到那个错误,这样我就不会再犯了!

令我惊讶的是,我原来的、不正确的代码可以正确执行,以至于它生成了一个看起来很真实的合成,只有一些难以检测的小异常。

感谢大家的帮助,并向那些我不同意的人道歉,他们说问题不在于随机数生成器!

最佳答案

最初我以为您可能遇到了一些数值分析问题。然而,在 python 中尝试了一百万个样本,我得到以下观察结果:

>>> T = int(1e6)
>>> xs = [ -math.log10(random.random()) for i in range(T)]
>>> len([x for x in xs if 0 <= x < 0.1])
205614
>>> len([x for x in xs if 0.1 <= x < 0.2])
163736
>>> len([x for x in xs if 0.2 <= x < 0.3])
129627
>>> len([x for x in xs if 0.3 <= x < 0.4])
103413
>>> len([x for x in xs if 0.4 <= x < 0.5])
81734

如果 X = -log_10(x) 并且 x 均匀分布在 [0, 1) 上,那么我们应该有

P(M <= X < M + d) = P(-M-d < log_10(x) <= -M) = 10^(-M) - 10^(-M-d)

而上面的数字基本完全符合这些概率,例如

1 - 10^(-0.1) = 0.205672

这与我们在上面的一百万次试验中观察到的 205614 次非常吻合。

对于上面的 python 代码,你得到的结果与我得到的结果不同吗?

关于python - 将 random.random uniform 转换为指数分布不会产生正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64675958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com