Scipy curve_fit returns 负方差
Scipy curve_fit returns negative variance
我正在尝试使用 curvefit 将我的数据拟合为两个对数。
from scipy.optimize import curve_fit
def func_2log(x, a, b, c, d, e):
return a*np.log(x + 1 + b) +c*np.log(x + 1 + d) + e
p, cov = curve_fit(func_2log, x, y, p0 = initial_guess, sigma = yerr, maxfev = 100000)
但是,当我打印协方差矩阵时,我得到:
[[ -2.23883493e+06 -3.92893042e+09 -1.87846128e+01 -4.27371608e+02
2.46442543e+07]
[ -3.92893042e+09 -6.89487710e+12 -3.29629278e+04 -7.49919180e+05
4.32481902e+10]
[ -1.87846014e+01 -3.29629077e+04 -1.53314974e-04 -3.43241587e-03
2.06772574e+02]
[ -4.27371198e+02 -7.49918462e+05 -3.43241462e-03 -7.58284163e-02
4.70429813e+03]
[ 2.46442543e+07 4.32481902e+10 2.06772700e+02 4.70430264e+03
-2.71274697e+08]]
这个矩阵在数学上如何可能?一个参数怎么会和自己负相关呢??
编辑:我不想包含数据本身,因为 x 和 y 有大约 90,000 个元素。 x 从 0 到 87244,步长为 1,y 的范围从 2 到 7。
提前感谢您的帮助。
curve_fit
内的协方差计算包含:
cov_x = inv(dot(transpose(R), R))
其中 R^T R 是优化算法生成的 hessian 的近似值。看起来很确定,对吧?
结果在精确算术上确实是正定的。然而,
在您的情况下可能发生的情况是近似值具有较高的条件数,因此计算逆结果时的舍入误差会导致正定性损失。事实上,你上面给出的矩阵的条件数是 ~ 10^21.
如果是这样,这在实践中可能意味着对于参数的某些线性组合,估计方差是无限的,这会阻止获得任何协方差的可靠估计。
(例如,如果为 a = 0
获得了最佳拟合,b
将变得不明确,这可能会破坏协方差估计。)
我正在尝试使用 curvefit 将我的数据拟合为两个对数。
from scipy.optimize import curve_fit
def func_2log(x, a, b, c, d, e):
return a*np.log(x + 1 + b) +c*np.log(x + 1 + d) + e
p, cov = curve_fit(func_2log, x, y, p0 = initial_guess, sigma = yerr, maxfev = 100000)
但是,当我打印协方差矩阵时,我得到:
[[ -2.23883493e+06 -3.92893042e+09 -1.87846128e+01 -4.27371608e+02 2.46442543e+07]
[ -3.92893042e+09 -6.89487710e+12 -3.29629278e+04 -7.49919180e+05 4.32481902e+10]
[ -1.87846014e+01 -3.29629077e+04 -1.53314974e-04 -3.43241587e-03 2.06772574e+02]
[ -4.27371198e+02 -7.49918462e+05 -3.43241462e-03 -7.58284163e-02 4.70429813e+03]
[ 2.46442543e+07 4.32481902e+10 2.06772700e+02 4.70430264e+03 -2.71274697e+08]]
这个矩阵在数学上如何可能?一个参数怎么会和自己负相关呢??
编辑:我不想包含数据本身,因为 x 和 y 有大约 90,000 个元素。 x 从 0 到 87244,步长为 1,y 的范围从 2 到 7。
提前感谢您的帮助。
curve_fit
内的协方差计算包含:
cov_x = inv(dot(transpose(R), R))
其中 R^T R 是优化算法生成的 hessian 的近似值。看起来很确定,对吧?
结果在精确算术上确实是正定的。然而, 在您的情况下可能发生的情况是近似值具有较高的条件数,因此计算逆结果时的舍入误差会导致正定性损失。事实上,你上面给出的矩阵的条件数是 ~ 10^21.
如果是这样,这在实践中可能意味着对于参数的某些线性组合,估计方差是无限的,这会阻止获得任何协方差的可靠估计。
(例如,如果为 a = 0
获得了最佳拟合,b
将变得不明确,这可能会破坏协方差估计。)