【发布时间】:2013-07-03 03:08:55
【问题描述】:
我正在尝试重新创建最大似然分布拟合,我已经可以在 Matlab 和 R 中做到这一点,但现在我想使用 scipy。特别是,我想估计我的数据集的 Weibull 分布参数。
我试过这个:
import scipy.stats as s
import numpy as np
import matplotlib.pyplot as plt
def weib(x,n,a):
return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)
data = np.loadtxt("stack_data.csv")
(loc, scale) = s.exponweib.fit_loc_scale(data, 1, 1)
print loc, scale
x = np.linspace(data.min(), data.max(), 1000)
plt.plot(x, weib(x, loc, scale))
plt.hist(data, data.max(), density=True)
plt.show()
得到这个:
(2.5827280639441961, 3.4955032285727947)
还有一个如下所示的分布:
在阅读了http://www.johndcook.com/distributions_scipy.html 之后,我一直在使用exponweib。我还尝试了 scipy 中的其他 Weibull 函数(以防万一!)。
在 Matlab(使用分布拟合工具 - 见屏幕截图)和 R(使用 MASS 库函数 fitdistr 和 GAMLSS 包)中,我得到的 a(loc)和 b(scale)参数更像 1.58463497 5.93030013。我相信这三种方法都使用最大似然法进行分布拟合。
我已经发布了我的数据here,如果您想尝试一下!为了完整起见,我使用的是 Python 2.7.5、Scipy 0.12.0、R 2.15.2 和 Matlab 2012b。
为什么我得到不同的结果!?
【问题讨论】:
-
对于最大似然拟合,使用
fit方法,并使用关键字参数f0和floc来固定第一个形状参数和位置。请参阅@user333700 的回答。 -
我无法使用 weibull_min 或 exponweib 获得 pdf 绘图开头的平坦部分(也不是 frechet 或类似的)。可能参数化有额外的不同。
-
@user333700:您发现形状参数为 1.855。只有shape参数大于2时,PDF在0处的斜率才为0。
-
@user333700:另外,当我在 R 中运行
fitdistr(x, "weibull")时,我得到shape=1.85529987和scale=6.88224649,这与exponweib的fit方法非常吻合。 -
关键是在
stats.exponweib.fit(x, loc=0)中使用loc=0。但是,您的数据链接已损坏 - 它指向的是图像,而不是 csv。
标签: python numpy scipy distribution weibull