2013-03-30 154 views

回答

20

如果您在您的來電polyfit指定full=True,將包括額外的信息:

>>> x = np.arange(100) 
>>> y = x**2 + 3*x + 5 + np.random.rand(100) 
>>> np.polyfit(x, y, 2) 
array([ 0.99995888, 3.00221219, 5.56776641]) 
>>> np.polyfit(x, y, 2, full=True) 
(array([ 0.99995888, 3.00221219, 5.56776641]), # coefficients 
array([ 7.19260721]), # residuals 
3, # rank 
array([ 11.87708199, 3.5299267 , 0.52876389]), # singular values 
2.2204460492503131e-14) # conditioning threshold 

返回的剩餘價值是配合誤差的平方的總和,不知道這是你是什麼後:

>>> np.sum((np.polyval(np.polyfit(x, y, 2), x) - y)**2) 
7.1926072073491056 

在1.7版本也有一個cov關鍵字,將返回的協方差矩陣的係數,你可以用它來計算擬合係數本身的不確定性。

+0

你知道如果np.polyfit使用TLS(總最小二乘法,也稱爲正交最小二乘法)或OLS(普通最小二乘法)來尋找最佳擬合? –

16

正如你可以在documentation看到:

Returns 
------- 
p : ndarray, shape (M,) or (M, K) 
    Polynomial coefficients, highest power first. 
    If `y` was 2-D, the coefficients for `k`-th data set are in ``p[:,k]``. 

residuals, rank, singular_values, rcond : present only if `full` = True 
    Residuals of the least-squares fit, the effective rank of the scaled 
    Vandermonde coefficient matrix, its singular values, and the specified 
    value of `rcond`. For more details, see `linalg.lstsq`. 

這意味着如果你可以做一個健康,我殘差爲:

import numpy as np 
x = np.arange(10) 
y = x**2 -3*x + np.random.random(10) 

p, res, _, _, _ = numpy.polyfit(x, y, deg, full=True) 

然後,p是你適合的參數,如上所述,res將是殘差。 _是因爲您不需要保存最後三個參數,因此您可以將它們保存在您不會使用的變量_中。這是一個慣例,不是必需的。


@海梅的答案解釋了什麼是殘差的意思。你可以做的另一件事是將這些平方偏差看作一個函數(總和爲res)。這對於看到一個不夠充分的趨勢特別有用。 res可以很大,因爲統計噪聲,或者可能是系統性差配件,例如:

x = np.arange(100) 
y = 1000*np.sqrt(x) + x**2 - 10*x + 500*np.random.random(100) - 250 

p = np.polyfit(x,y,2) # insufficient degree to include sqrt 

yfit = np.polyval(p,x) 

figure() 
plot(x,y, label='data') 
plot(x,yfit, label='fit') 
plot(x,yfit-y, label='var') 

所以在圖中,記下顯得格格不入附近x = 0
polyfit