gpt4 book ai didi

python - 从 scipy.optimize.curve_fit 获取与参数估计相关的标准误差

转载 作者:太空狗 更新时间:2023-10-30 02:20:07 24 4
gpt4 key购买 nike

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

谢谢

最佳答案

参数的方差是方差-协方差矩阵的对角线元素,标准误差是它的平方根。 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

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

在您的情况下,我认为您从未使用过ab。所以它就像这里的第一个例子。

关于python - 从 scipy.optimize.curve_fit 获取与参数估计相关的标准误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com