我已经完成了将Excel插件@Risk中的模拟转换为Python的任务。给定分布类型和mu,sigma或高低值,这些功能与numpy的随机数模拟紧密结合。我正在做的一个例子是here。
在链接的示例中,mu = 2和sigma = 1。使用numpy,我得到的分布与@Risk相同。
dist = np.random.lognormal(2, 1, 1000)
但是,当我将numpy与以下参数一起使用时-我无法再复制@Risk分布。
mu = 0.4,@Risk中的sigma = 0.16: Histogram for 1000 rsamples
和在Python中: histogram for 1000 rsamples
对于相同的mu和sigma,结果是两个完全不同的分布。因此,我现在对numpy对mu和sigma输入的期望感到非常困惑。我已经阅读了链接here的文档,但是为什么会有一组参数给我匹配的分布,而另一组值却不能。
我在这里想念什么?
答案 0 :(得分:0)
再看看链接到的@RISK文档和numpy.random.lognormal
的文档字符串。参数与numpy.random.lognormal
匹配的@RISK函数为RiskLognorm2。 numpy.random.lognormal
和RiskLognorm2
的参数是正态分布的平均值和标准偏差。换句话说,它们描述了数据的对数的分布。
@RISK文档解释了RiskLognorm
的参数是对数正态分布本身的均值和标准分布。给出了在两种参数化分布方法之间进行转换的公式。
如果您确定@RISK代码中的参数正确,则必须将这些参数转换为numpy.random.lognormal
使用的格式。给定值mean
和stddev
作为RiskLognorm
使用的参数,您可以获取mu
的参数sigma
和numpy.random.lognormal
,如下所示:
sigma_squared = np.log((stddev/mean)**2 + 1)
mu = np.log(mean) - 0.5*sigma_squared
sigma = np.sqrt(sigma_squared)
例如,假设均值和标准差。开发。的分布是
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)