【问题标题】:Getting standard error associated with parameter estimates from scipy.optimize.curve_fit从 scipy.optimize.curve_fit 获取与参数估计相关的标准误差
【发布时间】:2023-03-09 23:12:01
【问题描述】:

我正在使用scipy.optimize.curve_fit 来拟合我拥有的一些数据的曲线。在大多数情况下,曲线似乎非常适合。出于某种原因,当我打印出来时,pcov = inf。

我真正需要的是计算与我正在拟合的参数相关的误差,即使它确实给了我协方差矩阵,我也不知道该怎么做。

适合的模型是:

def intensity(x,R_out,R_in,K_in,K_out,a,b,c):
    K_in,K_out = abs(0.0),abs(K_out)
    if x<=R_in:
        return 2*R_out*(K_out*np.sqrt(1-x**2/R_out**2)-
                (K_out-0.0)*np.sqrt(R_in**2/R_out**2-x**2/R_out**2)) + c
    elif x>=R_in and x<=R_out:
        return K_out*2*R_out*np.sqrt(1-x**2/R_out**2) + c
    elif x>R_out:
        return c

intensity_vec = np.vectorize(intensity)



def intensity_vec_self(x,R_out,R_in,K_in,K_out,a,b,c):
    y = np.zeros(x.shape)
    for i in range(len(y)):
        y[i]=intensity_vec(x[i],R_out,R_in,K_in,K_out,a,b,c)
    return y

有 400 个数据点,如果您认为有帮助,我可以把它放在这里。

总而言之,我无法让 curve_fit 打印出我的 pcov 并且需要帮助以找出原因以及是否可以这样做。

另外,如果它是一个快速的解释,我想知道如何使用pcov 数组来获得与我的适合相关的错误。

谢谢

【问题讨论】:

    标签: python scipy mathematical-optimization curve-fitting


    【解决方案1】:

    参数的方差是方差-协方差矩阵的对角元素,标准误是它的平方根。 np.sqrt(np.diag(pcov))

    关于获取inf,查看并比较这两个示例:

    In [129]:
    import numpy as np
    def func(x, a, b, c, d):
        return a * np.exp(-b * x) + c
    
    xdata = np.linspace(0, 4, 50)
    y = func(xdata, 2.5, 1.3, 0.5, 1)
    ydata = y + 0.2 * np.random.normal(size=len(xdata))
    popt, pcov = so.curve_fit(func, xdata, ydata)
    print np.sqrt(np.diag(pcov))
    [ inf  inf  inf  inf]
    

    还有:

    In [130]:
    
    def func(x, a, b, c):
        return a * np.exp(-b * x) + c
    
    xdata = np.linspace(0, 4, 50)
    y = func(xdata, 2.5, 1.3, 0.5)
    ydata = y + 0.2 * np.random.normal(size=len(xdata))
    popt, pcov = so.curve_fit(func, xdata, ydata)
    print np.sqrt(np.diag(pcov))
    [ 0.11097646  0.11849107  0.05230711]
    

    在这个极端的例子中,d 对函数func 没有影响,因此它将与+inf 的方差相关联,或者换句话说,它可以是几乎任何值。从func 中删除d 将变得有意义。

    实际上,如果参数的规模非常不同,比如说:

    def func(x, a, b, c, d):
        #return a * np.exp(-b * x) + c
        return a * np.exp(-b * x) + c + d*1e-10
    

    由于浮点上溢/下溢,您还将获得inf

    就您而言,我认为您从未使用过ab。所以就像这里的第一个例子一样。

    【讨论】:

    • 我明白你所说的在等式中包含这些额外参数,并已将它们从我的代码中删除。不幸的是,我留下了同样的问题。打印 pcov 返回 'inf'
    • 我不知道为什么它之前没有工作,但你的建议现在正在解决这个问题。当我应用更改时,我一定犯了一些错误。谢谢
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2017-11-21
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多