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

2 投票
1 回答
1910 浏览
提问于 2025-04-30 17:10

我有一组实验数据,想找一个函数来更好地描述这些数据的分布。在尝试不同的函数时,我发现使用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 个回答

1

不要把这完全当作答案,因为我没有足够的声望来评论。造成性能不好的原因并不是因为scipy做错了什么,而是因为模型本身没有很好地代表数据。在这种情况下,最大似然估计主要是基于平均值来工作的,而最小二乘法则试图更贴近曲线。这就是为什么高斯最大似然估计效果不好的原因。它没有考虑到所有的数据,而只是关注了分布的一些特性。

对于你的问题,我建议使用Landau分布来进行拟合。

撰写回答