如何在scipy.optimize.curve_fit的输出中获取卡方值?

12

在使用scipy.optimize.curve_fit()进行拟合时,能否直接获得卡方值的输出呢?

通常情况下,我们可以通过对模型和数据之间的差异进行平方、加权并求和来计算卡方值。然而,当参数sigma被传递一个二维矩阵(即数据的协方差矩阵)而不是简单的一维数组时,这个过程就不太直接了。

除了最佳拟合参数及其协方差矩阵外,curve_fit()真的只能提取这两个输出吗?

1个回答

11

通过scipy.optimize.curve_fit无法直接获取chi^2的值,需要手动计算。可以通过提供参数full_output=True来从curve_fit获得除poptpcov之外的附加输出,但是该附加输出不包含chi^2的值(例如在此处有关附加输出的文档:leastsq 此处)。

如果sigma是MxM数组,则由curve_fit最小化的chi^2函数的定义略有不同。在这种情况下,curve_fit最小化函数r.T @ inv(sigma) @ r,其中r = ydata - f(xdata, *popt),而不是一维sigma的情况下使用chisq = sum((r / sigma) ** 2),请参见sigma参数的文档。因此,在您的情况下,您还应能够使用优化参数和r.T @ inv(sigma) @ r计算chi^2。

另一种选择是使用另一个包,例如lmfit,其中可以直接从拟合结果获得chi square的值。

from lmfit.models import GaussianModel

model = GaussianModel()

# create parameters with initial guesses:
params = model.make_params(center=9, amplitude=40, sigma=1)  

result = model.fit(n, params, x=centers)
print(result.chisqr)

lmfit 确实是一个很棒的包。不过,它没有提供将 MxM 矩阵传递给 sigma 的选项,而只能传递一个一维数组。希望这在将来可以实现。 - Stefano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接