是否可以将chi平方的值作为scipy.optimize.curve_fit()
的直接输出?
通常,在拟合之后,通过对模型和数据之间的差进行平方,对不确定性进行加权并求和,可以很容易地计算出它。但是,向参数sigma
传递2D矩阵(数据的协方差矩阵)而不是简单的1D数组并不直接。
难道真的,最佳拟合参数及其协方差矩阵是只能从curve_fit()
提取的两个输出吗?
答案 0 :(得分:3)
没有人工计算,就不可能直接从scipy.optimize.curve_fit
获得chi ^ 2的值。尽管可以通过提供参数curve_fit
从popt
和pcov
之外的full_output=True
获得附加输出,但是附加输出不包含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
,请参见{{3} sigma
中的}。
因此,您还可以通过将r.T @ inv(sigma) @ r
与优化参数一起使用来计算chi ^ 2。
一种替代方法是使用另一个包,例如documentation,在其中可以从拟合结果直接获得卡方值:
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)