【问题标题】:How to obtain the chi squared value as an output of scipy.optimize.curve_fit?如何获得卡方值作为 scipy.optimize.curve_fit 的输出?
【发布时间】:2018-10-01 13:13:31
【问题描述】:

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

通常,通过对模型和数据之间的差异进行平方,对不确定性进行加权并求和,可以很容易地在拟合后计算它。但是,当参数sigma 传递一个二维矩阵(数据的协方差矩阵)而不是简单的一维数组时,它就没有那么直接了。

最适合的参数和它的协方差矩阵真的是唯一可以从curve_fit()提取的两个输出吗?

【问题讨论】:

    标签: python scipy curve-fitting chi-squared


    【解决方案1】:

    不手动计算是无法直接从scipy.optimize.curve_fit获取chi^2的值的。通过提供参数full_output=True,除了poptpcov 之外,还可以从curve_fit 获得额外的输出,但额外的输出不包含chi^2 的值。 (附加输出记录在例如leastsqhere)。

    sigma为MxM数组的情况下,curve_fit最小化的chi^2函数的定义略有不同。 在这种情况下,curve_fit 最小化函数r.T @ inv(sigma) @ r,其中r = ydata - f(xdata, *popt),而不是在一维sigma 的情况下的chisq = sum((r / sigma) ** 2),参见参数sigmadocumentation。 因此,您还应该能够通过使用 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)
    

    【讨论】:

    • lmfit 确实是一个很棒的包。不幸的是,它不提供将 MxM 矩阵传递给 sigma 的选项,而只提供一维数组。希望将来可以实施。
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2010-11-26
    • 2021-12-15
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多