2013-06-28 12 views
5

Ho una domanda sugli algoritmi di adattamento usati in scipy. Nel mio programma, ho una serie di punti dati X e Y con solo errori y, e vuole adattare una funzioneDifferenza tra algoritmi di adattamento in scipy

f(x) = (a[0] - a[1])/(1+np.exp(x-a[2])/a[3]) + a[1] 

ad esso.

Il problema è che ottengo assurdamente alti errori sui parametri e anche valori diversi e gli errori per i parametri in forma utilizzando i due in forma SciPy routine fit scipy.odr.ODR (con minimi quadrati algoritmo) e scipy.optimize. Darò il mio esempio:

Fit con scipy.odr.ODR, fit_type = 2

Beta: [ 11.96765963 68.98892582 100.20926023 0.60793377] 
Beta Std Error: [ 4.67560801e-01 3.37133614e+00 8.06031988e+04 4.90014367e+04] 
Beta Covariance: [[ 3.49790629e-02 1.14441187e-02 -1.92963671e+02 1.17312104e+02] 
[ 1.14441187e-02 1.81859542e+00 -5.93424196e+03 3.60765567e+03] 
[ -1.92963671e+02 -5.93424196e+03 1.03952883e+09 -6.31965068e+08] 
[ 1.17312104e+02 3.60765567e+03 -6.31965068e+08 3.84193143e+08]] 
Residual Variance: 6.24982731975 
Inverse Condition #: 1.61472215874e-08 
Reason(s) for Halting: 
Sum of squares convergence 

e poi la forma con scipy.optimize.leastsquares:

Fit con scipy.optimize. leastsq

beta: [ 11.9671859 68.98445306 99.43252045 1.32131099] 
Beta Std Error: [0.195503 1.384838 34.891521 45.950556] 
Beta Covariance: [[ 3.82214235e-02 -1.05423284e-02 -1.99742825e+00 2.63681933e+00] 
[ -1.05423284e-02 1.91777505e+00 1.27300761e+01 -1.67054172e+01] 
[ -1.99742825e+00 1.27300761e+01 1.21741826e+03 -1.60328181e+03] 
[ 2.63681933e+00 -1.67054172e+01 -1.60328181e+03 2.11145361e+03]] 
Residual Variance: 6.24982904455 (calulated by me) 

il mio punto è il terzo parametro fit: I risultati sono

scipy.odr. ODR, fit_type = 2: C = 100.209 +/- 80600

scipy.optimize.leastsq: C = 99.432 +/- 12.730

Non so il motivo per cui il primo errore è tanto più elevato. Ancora meglio: Se metto esattamente gli stessi punti di dati con errori in origine 9 ottengo C = x0 = 99,41849 +/- 0,20283

e ancora esattamente gli stessi dati in C++ ROOT Cern C = 99,85 +/- 1.373

anche se ho usato esattamente le stesse variabili iniziali per ROOT e Python. L'origine non ne ha bisogno.

Avete qualche idea del perché questo accada e quale sia il miglior risultato?

ho aggiunto il codice per voi in pastebin:

Grazie per l'aiuto!

EDIT: ecco la trama relativa a SirJohnFranklins messaggio: see comment below

+0

Potresti tracciare sullo stesso grafico gli errori e gli errori ottenuti da (1) 'scipy.odr' con errori xey, e (2)' ROOT' con errori xey. Inoltre, in che modo ROOT determina quale ponderazione relativa dare agli errori xey, dato che sono misurati in unità diverse? In 'scipy.odr',' sx' e 'sy' vengono convertiti in pesi dividendo 1.0 per i loro quadrati - fa' ROOT' fa lo stesso? –

risposta

1

Hai in realtà tenta tracciando il lato ODR e leastsq si adatta a fianco? Sembrano sostanzialmente identico:

enter image description here

considerazione ciò che i parametri corrispondono a - la funzione passo descritto da beta[0] e beta[1], i valori iniziali e finali, spiega di gran lunga la maggior parte della varianza nei dati.Al contrario, piccole modifiche in beta[2] e beta[3], il punto di inflessione e la pendenza, avranno relativamente poco effetto sulla forma complessiva della curva e quindi sulla varianza residua per l'adattamento. Non sorprende quindi che questi parametri abbiano errori standard elevati e che siano adattati in modo leggermente diverso dai due algoritmi.

Gli errori standard generali più elevati riportati da ODR sono dovuti al fatto che questo modello incorpora errori nei valori y mentre l'adattamento dei minimi quadrati ordinari no - errori nei valori y misurati dovrebbero ridurre la nostra fiducia nel parametri stimati di adattamento.

0

(Purtroppo, non riesco a caricare la misura, perché ho bisogno di più la reputazione. Darò la trama al capitano Sandwich, così da poter caricarlo per me.)

Sono nella stessa gruppo di lavoro come la persona che ha iniziato la discussione, ma ho fatto questa trama.

Così, ho aggiunto x-errori sui dati, perché non ero così lontano l'ultima volta. L'errore ottenuto attraverso l'ODR è ancora assurdamente alto (4.18550164e + 04 su beta [2]). Nella trama, ti mostro ciò che la FIT di [ROOT Cern] [2] dà, ora con xey errore. Qui, x0 è la beta [2].

La curva rossa e quella verde hanno una beta diversa, quella di sinistra meno l'errore di adattamento di 3.430 ottenuto da ROOT e quello di destra più l'errore. Penso che questo abbia perfettamente senso, molto di più, rispetto all'errore di 0.2 dato dall'adattamento di Origin 9 (che può gestire solo errori y, credo) o l'errore di circa 40k dato dall'ODR che include anche x e y errori.

Forse, perché il ROOT è principalmente utilizzato dagli astrofisici che hanno bisogno di algoritmi di adattamento molto deboli, può gestire adattamenti molto più difficili, ma non ne so abbastanza della robustezza degli algoritmi di adattamento.

+0

Davvero non penso che ci sia alcun problema con la robustezza degli attacchi: tutti i diversi algoritmi che hai provato sembrano dare stime ragionevoli per i parametri del modello. L'unica domanda nella mia mente riguarda la segnalazione da parte di ODR degli errori standard sui parametri di adattamento. –

Problemi correlati