我正在尝试使用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.53​​314974e-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是优化算法产生的粗麻布的近似值。看起来肯定肯定吧?

结果确实在精确的算术上是肯定的。然而,
在您的情况下可能发生的情况是,近似值具有较高的条件数,因此在计算反结果时舍入误差会导致正定性的损失。实际上,您在上面给出的矩阵的条件数约为10 ^ 21。

如果是这样,那么实际上这可能意味着对于参数的某些线性组合,估计方差是无限的,这妨碍了获得任何协方差的可靠估计。

(例如,如果为a = 0获得最佳拟合,则b定义不明确,可能会破坏协方差估计。)

关于python - Scipy curve_fit返回负方差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28702631/

10-12 22:24