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

时间:2018-10-01 13:13:32

标签: python scipy curve-fitting chi-squared

是否可以将chi平方的值作为scipy.optimize.curve_fit()的直接输出?

通常,在拟合之后,通过对模型和数据之间的差进行平方,对不确定性进行加权并求和,可以很容易地计算出它。但是,向参数sigma传递2D矩阵(数据的协方差矩阵)而不是简单的1D数组并不直接。

难道真的,最佳拟合参数及其协方差矩阵是只能从curve_fit()提取的两个输出吗?

1 个答案:

答案 0 :(得分:3)

没有人工计算,就不可能直接从scipy.optimize.curve_fit获得chi ^ 2的值。尽管可以通过提供参数curve_fitpoptpcov之外的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)