gnuplot vs numpy - data fit

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

gnuplot vs numpy - data fit

Messaggio 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.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti