是否可以获得卡方的值作为scipy.optimize.curve_fit()
的直接输出?
通常,在拟合后很容易计算它,方法是对模型和数据之间的差异进行平方,按不确定性加权并汇总所有内容。但是,当参数sigma
传递二维矩阵(数据的协方差矩阵(而不是简单的一维数组时,它就不那么直接了。
最佳拟合参数及其协方差矩阵真的是唯一可以从curve_fit()
中提取的两个输出吗?
如果不手动计算,就不可能直接从scipy.optimize.curve_fit
获得 chi^2 的值。除了popt
和pcov
之外,可以通过提供参数full_output=True
从curve_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)