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