在使用scipy.optimize.curve_fit()
进行拟合时,能否直接获得卡方值的输出呢?
通常情况下,我们可以通过对模型和数据之间的差异进行平方、加权并求和来计算卡方值。然而,当参数sigma
被传递一个二维矩阵(即数据的协方差矩阵)而不是简单的一维数组时,这个过程就不太直接了。
除了最佳拟合参数及其协方差矩阵外,curve_fit()
真的只能提取这两个输出吗?
在使用scipy.optimize.curve_fit()
进行拟合时,能否直接获得卡方值的输出呢?
通常情况下,我们可以通过对模型和数据之间的差异进行平方、加权并求和来计算卡方值。然而,当参数sigma
被传递一个二维矩阵(即数据的协方差矩阵)而不是简单的一维数组时,这个过程就不太直接了。
除了最佳拟合参数及其协方差矩阵外,curve_fit()
真的只能提取这两个输出吗?
通过scipy.optimize.curve_fit
无法直接获取chi^2的值,需要手动计算。可以通过提供参数full_output=True
来从curve_fit
获得除popt
和pcov
之外的附加输出,但是该附加输出不包含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,其中可以直接从拟合结果获得chi square的值。
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)
lmfit
确实是一个很棒的包。不过,它没有提供将 MxM 矩阵传递给sigma
的选项,而只能传递一个一维数组。希望这在将来可以实现。 - Stefano