2015-02-24 79 views
2

我正在尝试使用curvefit将我的数据拟合为两个对数。Scipy curve_fit返回负方差

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.

感谢您提前提供任何帮助。

+0

我看到的协方差矩阵的元素是巨大的;我的第一个猜测是,在不知道涉及的输入数据的情况下,算法没有收敛。什么是'x'和'y'?如果这些数字太庞大,您可以尝试重新调整它们 - 这不会改变解决方案,但它可能使数字更容易找到。 – 2015-02-24 17:53:51

回答

2

内部curve_fit用于协方差的计算包含此:

cov_x = inv(dot(transpose(R), R)) 

当R^T R是近似由优化算法产生的粗麻布。看起来肯定,对吧?

确切的算术结果确实是正定的。但是, 您的情况可能发生的情况是,近似值具有较高的条件数,因此计算相反结果时的误差会导致正定的损失。事实上,你给出的矩阵的条件数是〜10^21。

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

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

+0

谢谢!你的回答非常有见地。你如何估计条件编号? – shadeless 2015-02-24 20:20:40

+0

你可以使用'numpy.linalg.cond'来获得 – 2015-02-24 20:47:33