scipy,对数正态分布 - 参数

Jak*_* M. 27 python statistics scipy

我想使用python将对数正态分布拟合到我的数据中scipy.stats.lognormal.fit.根据手册,fit返回shape,loc,scale参数.但是,对数正态分布通常只需要两个参数:均值和标准差.

如何解释scipy fit函数的结果?如何获得mean和std.dev.

ars*_*ars 33

scipy中的分布以通用方式编码,具有两个参数位置和比例,因此location是loc使分布向左或向右移动的参数(),scale而是压缩或拉伸分布的参数.

对于两个参数对数正态分布,"mean"和"std dev"对应log(scale)和shape(你可以让loc=0).

以下说明了如何拟合对数正态分布以找到感兴趣的两个参数:

In [56]: import numpy as np

In [57]: from scipy import stats

In [58]: logsample = stats.norm.rvs(loc=10, scale=3, size=1000) # logsample ~ N(mu=10, sigma=3)

In [59]: sample = np.exp(logsample) # sample ~ lognormal(10, 3)

In [60]: shape, loc, scale = stats.lognorm.fit(sample, floc=0) # hold location to 0 while fitting

In [61]: shape, loc, scale
Out[61]: (2.9212650122639419, 0, 21318.029350592606)

In [62]: np.log(scale), shape  # mu, sigma
Out[62]: (9.9673084420467362, 2.9212650122639419)
Run Code Online (Sandbox Code Playgroud)

  • 两条评论:scipy 0.9中有一个bug,其中floc已经修复了scipy 0.10 http://projects.scipy.org/scipy/ticket/1536,其次是因为泛型参数化,lognormal分布没有平常参数化,例如http://projects.scipy.org/scipy/ticket/1502. (4认同)

Chr*_*ial 9

我只是花了一些时间来解决这个问题,并希望在这里记录它:如果你想x从三个返回值lognorm.fit(让它们调用它们(shape, loc, scale))获得概率密度(点),你需要使用这个公式:

x = 1 / (shape*((x-loc)/scale)*sqrt(2*pi)) * exp(-1/2*(log((x-loc)/scale)/shape)**2) / scale
Run Code Online (Sandbox Code Playgroud)

因此,作为(locµ,shape?scale?)的等式:

x =\frac {1} {(x-\mu)\ cdot\sqrt {2\pi\sigma ^ 2}}\cdot e ^ { - \frac {log(\ frac {x-\ mu} {\ alpha })^ 2} {2 \西格玛^ 2}}

  • 这不是我的公式,而是scipy的工作方式。我没有看到以(1 /α}结尾的除法运算,所以我假设您是在说用`scale`除法–如果我误解了,请纠正我。我前一段时间看了这段代码,但是如果我没错,这是对每种分布所做的事情,但是请注意,开始时还有另一个“标尺”,它们彼此抵消(如您在公式中所看到的)。 (2认同)