2013-03-30 7 views

risposta

20

Se si specifica full=True nella chiamata a polyfit, includerà informazioni aggiuntive:

>>> 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 

Il valore residuo restituito è la somma dei quadrati degli errori in forma, non so se questo è quello che sei dopo:

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

Nella versione 1.7 c'è anche una parola chiave cov che restituirà la matrice di covarianza per i vostri coefficienti, che è possibile utilizzare per calcolare l'incertezza dei coefficienti fit stessi.

+0

fai a sapere se np.polyfit utilizza TLS (Totale minimi quadrati noti anche come minimi quadrati ortogonali) o OLS (minimi ordinari) per trovare la soluzione migliore? –

16

Come si può vedere nella 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`. 

Il che significa che se si può fare una misura e ottenere i residui come:

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) 

Poi, il p sono i parametri in forma, e res saranno i residui, come descritto sopra. Gli _ sono perché non è necessario salvare gli ultimi tre parametri, quindi è sufficiente salvarli nella variabile _ che non si utilizzerà. Questa è una convenzione e non è richiesta.


@ risposta di Jaime spiega che cosa i mezzi residue. Un'altra cosa che puoi fare è osservare le deviazioni al quadrato come una funzione (la cui somma è res). Ciò è particolarmente utile per vedere una tendenza che non si adatta sufficientemente. res può essere grande a causa del rumore statistico, o forse sistematica poveri raccordo, ad esempio:

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') 

Così in figura, notare la forma scadente vicino x = 0:
polyfit