计算Scipy LOGNORM.CDF()并获得与MS Excel LOGNORM.DIST相同的答案

g0czyy6m  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在使用Microsoft Excel 2013中的LOGNORM.DIST复制一篇论文中的图表,并希望在Python中获得相同的图表。我在Excel中获得了正确的答案,但在Python中没有。
在我所擅长的方面,

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参数做了很多修改,但是没有任何效果。

dist.cdf(103)

应该给予50%的可能性,但显然我做错了什么。

yzuktlbb

yzuktlbb1#

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()

相关问题