计算ScipyLOGNORM.CDF()得到与MSExcelLOGNORM.DIST相同的答案

Calculate Scipy LOGNORM.CDF() and get the same answer as MS Excel LOGNORM.DIST

我正在使用 Microsoft Excel 2013 中的 LOGNORM.DIST 复制论文中的图表,并希望在 Python 中获得相同的图表。我在 excel 中得到正确答案,但在 python.

中却没有

在excel我有,

mean of ln(KE)      4.630495093
std dev of ln(KE)       0.560774853

然后我绘制 x (KE) 从 10 到 1000 并使用 Excel LOGNORM.DIST 并计算事件的概率。我从论文中得到了准确的答案,所以我对计算很有信心。剧情如下:

MS Excel 2013 Plot of LOGNORM.DIST

在python中,我使用的是Python 3.4和Scipy 0.16.0,我的代码如下:

%matplotlib inline
from scipy.stats import lognorm
import numpy as np
import matplotlib.pyplot as plt

shape = 0.560774853 #standard deviation
scale = 4.630495093 #mean
loc = 0

dist=lognorm(shape, loc, scale)
x=np.linspace(10,1000,200)

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_xscale('log')
ax.set_xlim([10., 1000.])
ax.set_ylim([0., 1.])
ax.plot(x,dist.cdf(x)), dist.cdf(103)

情节是,

Python Plot of LOGNORM

我在 loc 参数上弄乱了很多,但没有任何效果。 python代码的最后一行

dist.cdf(103)

应该给我50%的概率,但显然我做错了。

scipy lognorm 分布的 scale 参数为 exp(mean),其中 mean 是基础正态分布的均值。所以你应该写:

scale = np.exp(mean)

这是一个生成类似 Excel 情节的脚本:

import numpy as np
from scipy.stats import lognorm
import matplotlib.pyplot as plt

shape = 0.560774853
scale = np.exp(4.630495093)
loc = 0

dist = lognorm(shape, loc, scale)

x = np.linspace(10, 1000, 500)
plt.semilogx(x, dist.cdf(x))
plt.grid(True)
plt.grid(True, which='minor')
plt.show()