【发布时间】:2013-10-22 17:20:16
【问题描述】:
我正在尝试在 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
【问题讨论】:
-
您可以为我们重新运行几次代码并发布结果吗?
-
这段代码无法运行,因为您从未从任何地方导入任何这些函数。你可能想要
from numpy import sqrt, exp,但这只是猜测。 -
注意,numpy.random.normal 的比例是标准差,而不是方差。
-
另外,你是从哪里得到这些算法的?
-2*mu+mu*2是 0,所以我不确定你要计算什么。 -
@abarnert 我敢打赌这就是方差不精确的来源......