Pagina 1 di 1

gnuplot vs numpy - data fit

Inviato: martedì 10 giugno 2014, 19:30
da vaeVictis
Ciao a tutti.
Ho bisogno di scambiare un paio di messaggi con voi per comprendere meglio la natura di un problema "bizzarro".

Sto facendo un data fit, molto semplice, per trovare la retta che meglio approssima un insieme di dati sperimentali.
Un fit lineare insomma.

I dati sperimentali sono disposti con precisione su una retta, come mostra il seguente grafico

Codice: Seleziona tutto

plot 'logfree.dat' w l, "logfree_TempiLunghi.dat" w l lc black
dataSet.png
in cui è visibile, in nero, la parte del dataset relativa ai tempi lunghi.

Il file logfree.dat contiene tutti i dati, non solo quelli disegnati in verde, ma anche quelli disegnati in nero.
il file logfree_TempiLunghi.dat contiene solo i dati disegnati in nero.

Ora, io dovrei fare il fit solamente sulla parte verde del grafico, ossia per tempi elevati.
Per fare una prova, dato che i dati sono praticamente tutti su di una retta, ho fatto due data fit con gnuplot.
... con gnuplot ottengo due risultati molto diversi tra loro!!!

Se faccio il fit lineare con tutto il dataset (tratto rosso e tratto nero), ottengo un risultato che *dovrebbe* essere quello corretto, infatti:

Codice: Seleziona tutto

gnuplot> f(x) = A - B*x; fit f(x) "logfree.dat" via A, B
...
...
Final set of parameters            Asymptotic Standard Error
=======================            ==========================

A               = 11.984           +/- 1.155e-07    (9.639e-07%)
B               = 1.54444e-06      +/- 1e-14        (6.477e-07%)
ottenendo un "best fit" che sta praticamente "sopra" i dati sperimentali
bestFitCorretto.png
Se invece faccio il fit sulla sola parte nera, ovvero per i valori "elevati" dell'ascissa, ottengo un fit alquanto bizzarro:

Codice: Seleziona tutto

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

A               = 1                +/- 0.02197      (2.197%)
B               = 9.21029e-07      +/- 1.251e-09    (0.1358%)


correlation matrix of the fit parameters:

               A      B      
A               1.000 
B               0.997  1.000 
che mi dà un fit che proprio non c'azzecca nulla con i dati sperimentali, neanche nella parte in cui ho fatto il fit...
bestFitSbagliato.png
Per curiosità, mi sono andato a guardare come poterlo fare con numpy... e ho constatato che i due fit producono risultati analoghi, come si può constatare confrontando il fit di tutto il dataset:

Codice: Seleziona tutto

>>> from __future__ import print_function
>>> import numpy as np
>>> dataX, dataY = np.loadtxt('logfree.dat', unpack = True)
>>> parametri = np.polyfit(dataX, dataY, 1)
>>> print(*parametri)
-1.54444381545e-06 11.9839684013
con il fit del solo dataset relativo alle ascisse elevate

Codice: Seleziona tutto

>>> dataX, dataY = np.loadtxt('logfree_TempiLunghi.dat', unpack = True)
>>> parametri = np.polyfit(dataX, dataY, 1)
>>> print(*parametri)
-1.54444319827e-06 11.9839601694
È infatti abbastanza facile da constatare che i risultati (a parte ovviamente il segno - per B ottenuto con python), sono analoghi a quanto ottenuto con gnuplot... ma solamente per il fit con tutto il dataset.