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

Python 为什么scipy.stats分布的最大似然参数估计有时表现如此糟糕?,python,scipy,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

我有一组实验值,我想找到更好地描述其分布的函数。但是在修补一些函数的过程中,我发现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()


表现上的差异从戏剧性到温和,但在我的情况下,它总是存在的。为什么会这样?我如何为这个案例选择最合适的优化方法?

不要把这完全当作一个答案,因为我没有足够的声誉来评论。 这种糟糕性能的错误不是因为scipy做错了什么,而是因为模型本身并不表示数据。在这种情况下,最大似然度将对平均值起作用,而最小二乘法将试图接近曲线。这就是高斯最大似然性表现不佳的原因。它不考虑所有的数据,而是分布的一些属性。
对于您的问题,我建议使用Landau分布进行拟合。

不同的优化计算的内容不同,因此这更多的是统计问题,而不是堆栈溢出问题。不是两个优化器都试图优化同一个函数,而且其中一个的性能比另一个好。@von-m,我理解。当我谈到性能时,我指的是实际的拟合优度。问题是,如何在优化器之间进行选择?I在什么情况下,最大可能产生比最小二乘法更接近的拟合(反之亦然)?