使用Scipy与Matlab拟合对数正态分布

使用Scipy与Matlab拟合对数正态分布,第1张

使用Scipy与Matlab拟合对数正态分布

fit
scipy 0.9.0中的方法中有一个错误,已在更高版本的scipy中修复。

以下脚本的输出应为:

Explicit formula:   mu = 4.99203450, sig = 0.81691086Fit log(x) to norm: mu = 4.99203450, sig = 0.81691086Fit x to lognorm:   mu = 4.99203468, sig = 0.81691081

但是使用scipy 0.9.0,它是

Explicit formula:   mu = 4.99203450, sig = 0.81691086Fit log(x) to norm: mu = 4.99203450, sig = 0.81691086Fit x to lognorm:   mu = 4.23197270, sig = 1.11581240

以下测试脚本显示了获得相同结果的三种方法:

import numpy as npfrom scipy import statsdef lognfit(x, ddof=0):    x = np.asarray(x)    logx = np.log(x)    mu = logx.mean()    sig = logx.std(ddof=ddof)    return mu, sig# A simple data set for easy reproducibilityx = np.array([50., 50, 100, 200, 200, 300, 500])# Explicit formulamy_mu, my_sig = lognfit(x)# Fit a normal distribution to log(x)norm_mu, norm_sig = stats.norm.fit(np.log(x))# Fit the lognormal distributionlognorm_sig, _, lognorm_expmu = stats.lognorm.fit(x, floc=0)print "Explicit formula:   mu = %10.8f, sig = %10.8f" % (my_mu, my_sig)print "Fit log(x) to norm: mu = %10.8f, sig = %10.8f" % (norm_mu, norm_sig)print "Fit x to lognorm:   mu = %10.8f, sig = %10.8f" % (np.log(lognorm_expmu), lognorm_sig)

ddof=1
在std中带有选项。开发。计算以使用无偏方差估计:

In [104]: xOut[104]: array([  50.,   50.,  100.,  200.,  200.,  300.,  500.])In [105]: lognfit(x, ddof=1)Out[105]: (4.9920345004312647, 0.88236457185021866)

在matlab的lognfit文档中有一条注释,其中指出不使用审查时,lognfit使用方差的无偏估计量的平方根来计算sigma。这相当于在上面的代码中使用ddof
= 1。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5674847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存