如何获得卡方值作为scipy.optimize.curve_fit的输出?



是否可以获得卡方的值作为scipy.optimize.curve_fit()的直接输出?

通常,在拟合后很容易计算它,方法是对模型和数据之间的差异进行平方,按不确定性加权并汇总所有内容。但是,当参数sigma传递二维矩阵(数据的协方差矩阵(而不是简单的一维数组时,它就不那么直接了。

最佳拟合参数及其协方差矩阵真的是唯一可以从curve_fit()中提取的两个输出吗?

如果不手动计算,就不可能直接从scipy.optimize.curve_fit获得 chi^2 的值。除了poptpcov之外,可以通过提供参数full_output=Truecurve_fit获得额外的输出,但额外的输出不包含 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,其中卡方的值可以直接从拟合结果中获得:

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)

最新更新