我正在研究在一些整数数据上拟合 Weibull 分布并估计相关的形状、比例、位置参数。但是,我在这样做时注意到scipy.stats库的性能不佳。
所以,我采取了不同的方向,并使用下面的代码检查了合身性能。我首先使用参数 shape=3、scale=200、location=1 的 Weibull 分布创建 100 个数字。随后,我使用fitter库估计最佳分布拟合。
from fitter import Fitter
import numpy as np
from scipy.stats import weibull_min
# generate numbers
x = weibull_min.rvs(3, scale=200, loc=1, size=100)
# make them integers
data = np.asarray(x, dtype=int)
# fit one of the four distributions
f = Fitter(data, distributions=["gamma", "rayleigh", "uniform", "weibull_min"])
f.fit()
f.summary()
我希望最适合的是 Weibull 分布。我试过重新运行这个测试。有时 Weibull 拟合是一个很好的估计。然而,大多数时候 Weibull 拟合被报告为最差的结果。在这种情况下,估计的参数为 = (0.13836651040093312, 66.99999999999999, 1.3200752378443505)。我假设这些参数依次对应于形状、比例、位置。以下是拟合过程的摘要。
$ f.summary()
sumsquare_error aic bic kl_div
gamma 0.001601 1182.739756 -1090.410631 inf
rayleigh 0.001819 1154.204133 -1082.276256 inf
uniform 0.002241 1113.815217 -1061.400668 inf
weibull_min 0.004992 1558.203041 -976.698452 inf
此外,瑞利分布是形状参数 = 2 的 Weibull 分布的特例。因此,我希望得到的 Weibull 拟合至少与 Rayleigh 一样好。
更新
我在 numpy 版本 1.19.2 和 scipy 版本 1.5.2 的 Linux/Ubuntu 20.04 机器上运行了上面的测试。上面的代码似乎按预期运行,并为 Mac 机器上的 Weibull 分发返回了正确的结果。
我还通过使用 R 库fitdistrplus测试了在 Linux 机器上生成的数据x上拟合 Weibull 分布:
fit.weib <- fitdist(x, "weibull")
并观察到估计的形状和比例值与最初给定的值非常接近。到目前为止,最好的猜测是问题是由于一些 Python-Ubuntu 错误/不兼容造成的。
我可以被认为是这个领域的新手。所以,我想知道,我在这里做错了吗?还是以某种方式预期这个结果?任何帮助是极大的赞赏。
谢谢你。