Skip to main content
 首页 » 编程设计

Python Numpy 随机数之不一致

2025年05月04日14lyhabc

我正在尝试在 python 中生成对数正态分布的随机数(用于以后的 MC 模拟),但我发现当参数稍大时,结果非常不一致。

下面我从 Normals(然后使用 Exp)和直接从 LogNormals 生成一系列 LogNormals。 结果均值是可以接受的,但方差 - 相当不精确.. 这也适用于 mu = 4,5,...

如果你重新运行下面的代码几次 - 结果会完全不同。

代码:

import numpy as np 
mu = 10; 
tmp1 = np.random.normal(loc=-mu, scale=np.sqrt(mu*2),size=1e7) 
tmp1 = np.exp(tmp1) 
print tmp1.mean(), tmp1.var() 
tmp2 = np.random.lognormal(mean=-mu, sigma=np.sqrt(mu*2), size=1e7) 
print tmp2.mean(), tmp2.var() 
print 'True Mean:', np.exp(0), 'True Var:',(np.exp(mu*2)-1) 

关于如何解决这个问题有什么建议吗? 我也在 Wakari.io 上尝试过这个 - 所以那里的结果也是一致的

更新: 我从维基百科中获取了“真实”均值和方差公式:https://en.wikipedia.org/wiki/Log-normal_distribution

结果快照: 1)

0.798301881219 57161.0894726 
1.32976988569 2651578.69947 
True Mean: 1.0 True Var: 485165194.41 

2)

1.20346203176 315782.004309 
0.967106664211 408888.403175 
True Mean: 1.0 True Var: 485165194.41 

3) 最后一个有n=1e8个随机数

1.17719369919 2821978.59163 
0.913827160458 338931.343819 
True Mean: 1.0 True Var: 485165194.41 

请您参考如下方法:

即使样本量很大,使用这些参数,估计的方差也会在每次运行中发生巨大变化。这就是肥尾对数正态分布的本质。尝试多次运行 np.exp(np.random.normal(...)).var()。您将看到与 np.random.lognormal(...).var() 类似的值摆动。

在任何情况下,np.random.lognormal() 只是作为 np.exp(np.random.normal()) 实现的(好吧,C 等价物).