参数的方差是方差-协方差矩阵的对角线元素,标准误差是其平方根。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]
And:
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
,或者换句话说,它可以是任何值。去除d
from func
会得到有意义的东西。
实际上,如果参数的规模非常不同,请说:
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
由于浮点溢出/下溢。
就你而言,我认为你从未使用过a
and b
。就像这里的第一个例子一样。