2014-10-17 25 views
5

uso numpy.polyfit montare un secondo polinomio per un insieme di datinumpy.polyfit dà residui vuoti matrice

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

Per alcuni alcuni esempi dei miei dati, la variabile fit_err1 è vuota sebbene la l'adattamento è andato a buon fine, ovvero fit1 non è vuoto!

Qualcuno sa cosa vuol dire un residuo vuoto in questo contesto? Grazie!

EDIT: un esempio serie di dati:

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

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

risultato:

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

so che il montaggio di un 2 ° polinomio per un insieme di tre punti non è molto utile, ma poi ho si aspetta ancora che la funzione rilevi un avvertimento o (come in realtà ha determinato un adattamento) restituisca i residui effettivi, o entrambi (come "qui ci sono i residui, ma le tue condizioni sono scarse!").

+2

Puoi dare un piccolo esempio di alcuni dati che causano questo comportamento? –

+3

Un polinomio di secondo ordine può essere adattato esattamente a tre punti, quindi i residui saranno tutti zero. Se l'unica situazione in cui non si ottiene alcun residuo è quando il numero di punti è esattamente uno in più rispetto all'ordine del polinomio, questa è la tua spiegazione di cosa sta succedendo. – Jaime

+0

@Jaime: buon punto! Ma nel caso in cui l'adattamento è esatto, mi aspetterei che i residui siano piuttosto 0 rispetto a [], non è vero? – jkalden

risposta

5

Come sottolineato da @Jaime, se si dispone di tre punti, un polinomio di secondo ordine si adatterà esattamente. E il tuo punto è che l'errore dovrebbe essere piuttosto 0 di un array vuoto ha senso, ma questo è il comportamento corrente di np.linalg.lstsq, which is where np.polyfit is wrapped around.

Possiamo verificare questo comportamento facendo i minimi quadrati di un'equazione y = a*x**0 + b*x**1 + c*x**2 che conosciamo la risposta dovrebbe essere 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])) 

dove possiamo vedere che la seconda uscita è un array vuoto. E this is intended to work like this.

+0

Grazie @Saullo Castro! Non riesco ancora a ottenere l'intento dietro il valore restituito vuoto, ma almeno ora so che è vuoto da Intenzione, cioè non un bug ma una funzionalità! – jkalden

+1

@jkalden ricordate che 'NumPy' è in continua evoluzione e siete invitati a contribuire a discutere questo argomento nella mail list ([email protected]) –

+1

Quindi il take-away è che nell'impianto attuale un array vuoto significa che si adatta esattamente ? – Keith