2014-10-17 113 views
5

我使用numpy.polyfit以適合第二順序多項式到的一組數據的numpy.polyfit給出空殘差陣列

fit1, fit_err1, _, _, _ = np.polyfit(xint[:index_max], yint[:index_max], 2, full=True)

對於我的數據的一些幾個例子中,可變fit_err1是空雖然fit是成功的,即fit1不是空的!

有沒有人知道在這種情況下什麼是空的殘餘手段?謝謝!

編輯: 一個示例數據集:

x = [-488., -478., -473.] 
y = [ 0.02080881, 0.03233648, 0.03584448] 

fit1, fit_err1, _, _, _ = np.polyfit(x, y, 2, full=True) 

結果:

fit1 = [ -3.00778818e-05 -2.79024663e-02 -6.43272769e+00] 
fit_err1 = [] 

我知道,一個2階多項式擬合到一組三點是不是很有用,但後來我仍然期望函數要麼提出警告,要麼(因爲它實際上確定了適合)返回實際殘差,或者兩者都一樣(例如「這裏是殘差,但是你的條件很差!」)。

+2

你能給出一些導致這種行爲的數據的例子嗎? – 2014-10-17 16:40:19

+3

二階多項式可以精確地擬合三個點,所以殘差全部爲零。如果沒有殘差的唯一情況是當點的數量恰好比多項式的數量多一個時,這就是你對發生了什麼的解釋。 – Jaime 2014-10-17 18:04:33

+0

@Jaime:好點!但是,如果擬合精確,我預計殘差比[]更0,不是嗎? – jkalden 2014-10-17 20:25:34

回答

5

正如@Jaime所指出的那樣,如果您有三個點,那麼二階多項式將完全適合它。和你的觀點相比,錯誤應該是相當於0比空數組更有意義,但這是np.linalg.lstsqwhich is where np.polyfit is wrapped around的當前行爲。

我們可以測試這種行爲做最小二乘法擬合一個y = a*x**0 + b*x**1 + c*x**2式的,我們知道答案應該是a=0, b=0, c=1

np.linalg.lstsq([[1, 1 ,1], [1, 2, 4], [1, 3, 9]], [1, 4, 9]) 
#(array([ -3.43396424e-15, 3.88578059e-15, 1.00000000e+00]), 
# array([], dtype=float64), 
# 3, 
# array([ 10.64956309, 1.2507034 , 0.15015641])) 

在這裏我們可以看到第二個輸出是一個空數組。和this is intended to work like this

+0

謝謝你@Saullo Castro!我仍然沒有得到空值返回值的意圖,但至少現在我知道這是空的意向,即不是一個錯誤,而是一個功能! – jkalden 2014-10-18 13:28:55

+1

@jkalden請記住'NumPy'不斷髮展,歡迎您在郵件列表中貢獻討論此主題([email protected]) – 2014-10-18 15:23:32

+1

因此,重要的是,在當前的實踐中,空陣列意味着它恰好適合? – Keith 2016-05-18 00:33:19