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

How to obtain the chi squared value as an output of scipy.optimize.curve_fit?

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

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

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

不通过人工计算直接从scipy.optimize.curve_fit得到chi^2的值是不可能的。通过提供参数 full_output=True,可以从 curve_fit 获得除 poptpcov 之外的额外输出,但额外输出不包含 chi^2 的值。 (附加输出记录在例如 leastsq here)。

sigma为MxM数组的情况下,curve_fit最小化的chi^2函数的定义略有不同。 在这种情况下,curve_fit 最小化函数 r.T @ inv(sigma) @ r,其中 r = ydata - f(xdata, *popt) 而不是 chisq = sum((r / sigma) ** 2) 在一维 sigma 的情况下,参见 documentation 的参数 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)