为什么scipy.stats分布的最大似然参数估计有时会表现得如此差?

时间:2014-10-30 19:34:40

标签: python scipy

我有一组实验值,我想找到更好地描述其分布的函数。但是在修补一些函数的过程中,我发现scipy.optimize.curve_fit和scipy.stats.rv_continuous.fit给出了截然不同的结果,通常不支持后者。这是一个简单的例子:

#!/usr/bin/env python3
import numpy as np
from scipy.optimize import curve_fit as fit
from scipy.stats import gumbel_r, norm
import matplotlib.pyplot as plt

amps = np.loadtxt("pyr_11.txt")*-1000 # http://pastebin.com/raw.php?i=uPK31JGE
argsGumbel0 = gumbel_r.fit(amps)
argsGauss0 = norm.fit(amps)
bins = np.arange(60)
probs, binedges = np.histogram(amps, bins=bins, normed=True)
bincenters = 0.5*(binedges[1:]+binedges[:-1])
argsGumbel1 = fit(gumbel_r.pdf, bincenters, probs, p0=argsGumbel0)[0]
argsGauss1 = fit(norm.pdf, bincenters, probs, p0=argsGauss0)[0]

plt.figure()
plt.hist(amps, bins=bins, normed=True, color='0.5')
xes = np.arange(0, 60, 0.1)
plt.plot(xes, gumbel_r.pdf(xes, *argsGumbel0), linewidth=2, label='Gumbel, maximum likelihood')
plt.plot(xes, gumbel_r.pdf(xes, *argsGumbel1), linewidth=2, label='Gumbel, least squares')
plt.plot(xes, norm.pdf(xes, *argsGauss0), linewidth=2, label='Gauss, maximum likelihood')
plt.plot(xes, norm.pdf(xes, *argsGauss1), linewidth=2, label='Gauss, least squares')
plt.legend(loc='upper right')
plt.show()

enter image description here

表现的差异从戏剧到轻微不等,但就我而言,它始终存在。为什么会这样?如何为案例选择最合适的优化方法?

1 个答案:

答案 0 :(得分:1)

不要把这完全作为答案,因为我没有足够的声誉来评论。 这种糟糕表现的错误并不是因为scipy做错了什么,而是因为模型本身并不代表数据。在这种情况下,最大可能性将在平均值上起作用,而最小二乘法将尝试接近曲线。这就是高斯最大可能性表现不佳的原因。它不考虑所有数据,而是分布的一些属性。

对于您的问题,我建议使用Landau分发进行拟合。