从scipy.optimize.curve获得与参数估计相关的标准误差

2024-04-29 05:59:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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数组来获得与我的fit相关的错误。

谢谢


Tags: 数据inreturndefnpscipyabssqrt
1条回答
网友
1楼 · 发布于 2024-04-29 05:59:34

参数方差是方差协方差矩阵的对角元,标准差是其平方根。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。这就像这里的第一个例子。

相关问题 更多 >