我正在使用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)
,情节是,
我使用loc参数搞砸了很多,但没有任何效果。 python代码中的最后一行
dist.cdf(103)
应该给我50%的概率,但显然我做错了。
答案 0 :(得分:0)
scipy scale
分布的lognorm
参数为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()