我的任务是将Excel插件@Risk中的模拟转换为Python。这些函数与numpy的随机数模拟密切一致,给出了一种分布类型和mu、sigma或高低值。我正在做的一个例子是这里。
在链接的示例中,mu=2和sigma=1.使用numpy我得到了与@Risk相同的分布。
dist = np.random.lognormal(2, 1, 1000)但是,当我使用numpy与以下参数-我不能再复制@Risk分布。
mu=0.4,sigma=0.16 in @Risk:1000 r样本直方图
在Python中:1000 r样本直方图
结果是,对于相同的mu和sigma,两个完全不同的分布。所以我现在很困惑于numpy对mu和sigma输入的期望是什么。我已经阅读了docs链接的这里,但是为什么一组参数会给出匹配的发行版,而另一组值则不会。
我在这里错过了什么?
发布于 2018-07-19 15:48:32
再看看链接到的@RISK文档和numpy.random.lognormal的docstring。参数与numpy.random.lognormal匹配的@RISK函数是RiskLognorm2。numpy.random.lognormal和RiskLognorm2的参数是基础正态分布的均值和标准差。换句话说,它们描述了数据的对数分布。
@RISK文档解释了RiskLognorm的参数是日志正态分布本身的平均分布和标准分布。给出了两种参数化分布方法之间的转换公式。
如果您确信@RISK代码中的参数是正确的,则必须将这些参数转换为numpy.random.lognormal使用的表单。给定mean和stddev作为RiskLognorm使用的参数的值,您可以获得numpy.random.lognormal的参数mu和sigma,如下所示:
sigma_squared = np.log((stddev/mean)**2 + 1)
mu = np.log(mean) - 0.5*sigma_squared
sigma = np.sqrt(sigma_squared)例如,假设平均值和std。dev.的分布是
In [31]: mean = 0.40
In [32]: stddev = 0.16计算mu和sigma
In [33]: sigma_squared = np.log((stddev/mean)**2 + 1)
In [34]: mu = np.log(mean) - 0.5*sigma_squared
In [35]: sigma = np.sqrt(sigma_squared)使用numpy.random.logormal生成一个示例,并检查其统计信息:
In [36]: sample = np.random.lognormal(mu, sigma, size=1000)
In [37]: np.mean(sample)
Out[37]: 0.3936244646485409
In [38]: np.std(sample)
Out[38]: 0.16280712706987954
In [39]: np.min(sample), np.max(sample)
Out[39]: (0.1311593293919604, 1.7218021130668375)https://stackoverflow.com/questions/50949089
复制相似问题