2015-02-24 94 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