Gnuplot
Gegevens aanpassen met gnuplot
Zoeken…
Invoering
De opdracht Fit kan een door de gebruiker gedefinieerde functie aanpassen aan een set gegevenspunten (x,y)
of (x,y,z)
, met behulp van een implementatie van het niet-lineaire kleinste-kwadraten ( NLLS ) Marquardt-Levenberg-algoritme.
Elke door de gebruiker gedefinieerde variabele die in de hoofdtekst voorkomt, kan als een parameter voor aanpassing dienen, maar het retourtype van de functie moet reëel zijn.
Syntaxis
- fit [ xrange ] [ yrange ] functie " datafile " met behulp van modifier via parameter_file
parameters
parameters | Detail |
---|---|
Passende parameters a , b , c en elke letter die nog niet eerder was gebruikt | Gebruik letters om parameters weer te geven die worden gebruikt om in een functie te passen. Bijv .: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
Bestandsparameters start.par | In plaats daarvan gebruiken we niet-geïnitialiseerde parameters (de Marquardt-Levenberg initialiseert automatisch voor u a=b=c=...=1 ) u kunt ze in een bestand start.par en ze aanroepen met in de parameter_file sectie. Bijv .: fit f(x) 'data.dat' u 1:2 via 'start.par' . Een voorbeeld voor het start.par bestand is hieronder weergegeven |
Opmerkingen
Korte introductie
fit
wordt gebruikt om een set parameters te vinden die 'het beste' past bij uw gegevens voor uw door de gebruiker gedefinieerde functie. De fit wordt beoordeeld op basis van de som van de gekwadrateerde verschillen of 'residuen' (SSR) tussen de ingevoerde gegevenspunten en de functiewaarden, geëvalueerd op dezelfde plaatsen. Deze hoeveelheid wordt vaak 'chisquare' genoemd (dwz de Griekse letter chi, tot de macht van 2). Het algoritme probeert SSR te minimaliseren, of beter gezegd, WSSR, omdat de residuen worden 'gewogen' door de invoergegevensfouten (of 1.0) voordat ze worden gekwadrateerd. ( Ibidem )
Het bestand fit.log
Na elke iteratiestap wordt gedetailleerde informatie gegeven over de toestand van de aanpassing, zowel op het scherm als in een zogenaamd logbestand fit.log
. Dit bestand wordt nooit gewist maar altijd toegevoegd zodat de geschiedenis van de pasvorm niet verloren gaat.
Gegevens met fouten aanpassen
Er kunnen maximaal 12 onafhankelijke variabelen zijn, er is altijd 1 afhankelijke variabele en er kan een willekeurig aantal parameters worden aangepast. Optioneel kunnen foutschattingen worden ingevoerd voor het wegen van de gegevenspunten. (T. Williams, C. Kelley - gnuplot 5.0, een interactief plotprogramma )
Als u een gegevensset hebt en wilt passen als de opdracht erg eenvoudig en natuurlijk is:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
waar in plaats daarvan f(x)
ook f(x, y)
. In het geval dat u ook schattingen van gegevensfouten hebt, voegt u de {y | xy | z}errors
( { | }
vertegenwoordigen de mogelijke keuzes) in de modifier- optie (zie Syntaxis) . Bijvoorbeeld
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
waar de {y | xy | z}errors
vereist respectievelijk 1 ( y
), 2 ( xy
), 1 ( z
) kolom die de waarde van de foutschatting specificeert.
Exponentiële aanpassing met xyerrors
van een bestand
Gegevensfoutschattingen worden gebruikt om het relatieve gewicht van elk gegevenspunt te berekenen bij het bepalen van de gewogen som van gekwadrateerde residuen, WSSR of chisquare. Ze kunnen de parameterschattingen beïnvloeden, omdat ze bepalen hoeveel invloed de afwijking van elk gegevenspunt van de gepaste functie heeft op de uiteindelijke waarden. Een deel van de geschikte uitvoerinformatie, inclusief de parameterfoutschattingen, is zinvoller als nauwkeurige gegevensfoutschattingen zijn verstrekt .. ( Ibidem )
We nemen een voorbeeldgegevensset measured.dat
, samengesteld uit 4 kolommen: de x-ascoördinaten ( Temperature (K)
), de y- T_err (K)
Pressure (kPa)
), de x-foutschattingen ( T_err (K)
) en de y-foutschattingen ( P_err (kPa)
).
#### 'measured.dat' ####
### Dependence of boiling water from Temperature and Pressure
##Temperature (K) - Pressure (kPa) - T_err (K) - P_err (kPa)
368.5 73.332 0.66 1.5
364.2 62.668 0.66 1.0
359.2 52.004 0.66 0.8
354.5 44.006 0.66 0.7
348.7 34.675 0.66 1.2
343.7 28.010 0.66 1.6
338.7 22.678 0.66 1.2
334.2 17.346 0.66 1.5
329.0 14.680 0.66 1.6
324.0 10.681 0.66 1.2
319.1 8.015 0.66 0.8
314.6 6.682 0.66 1.0
308.7 5.349 0.66 1.5
Stel nu het prototype samen van de functie die uit de theorie onze gegevens zou moeten benaderen. In dit geval:
Z = 0.001
f(x) = W * exp(x * Z)
waar we de parameter Z
hebben geïnitialiseerd omdat anders het evalueren van de exponentiële functie exp(x * Z)
resulteert in enorme waarden, wat leidt tot (zwevende punt) Infinity en NaN in het aanpassingsalgoritme Marquardt-Levenberg, meestal hoeft u de initialisatie niet te initialiseren variabelen - kijk hier als u meer wilt weten over Marquardt-Levenberg.
Het is tijd om de gegevens te passen!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Het resultaat zal eruit zien
After 360 iterations the fit converged.
final sum of squares of residuals : 10.4163
rel. change during last iteration : -5.83931e-07
degrees of freedom (FIT_NDF) : 11
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 0.973105
variance of residuals (reduced chisquare) = WSSR/ndf : 0.946933
p-value of the Chisq distribution (FIT_P) : 0.493377
Final set of parameters Asymptotic Standard Error
======================= ==========================
W = 1.13381e-05 +/- 4.249e-06 (37.47%)
Z = 0.0426853 +/- 0.001047 (2.453%)
correlation matrix of the fit parameters:
W Z
W 1.000
Z -0.999 1.000
Waar nu W
en Z
zijn gevuld met de gewenste parameters en foutschattingen voor die ene.
De onderstaande code geeft de volgende grafiek.
set term pos col
set out 'PvsT.ps'
set grid
set key center
set xlabel 'T (K)'
set ylabel 'P (kPa)'
Z = 0.001
f(x) = W * exp(x * Z)
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
p [305:] 'measured.dat' u 1:2:3:4 ps 1.3 pt 2 t 'Data' w xyerrorbars,\
f(x) t 'Fit'
Perceel met pasvorm van measured.dat
Met de opdracht with xyerrorbars
zal fouten schattingen op de x- en op de y weer te geven. set grid
plaatst een stippellijn op de belangrijkste tics.
In het geval dat foutschattingen niet beschikbaar of onbelangrijk zijn, is het ook mogelijk om gegevens te passen zonder de {y | xy | z}errors
optie voor {y | xy | z}errors
aanpassen:
fit f(x) "measured.dat" u 1:2 via W, Z
In dit geval moesten ook de xyerrorbars
worden vermeden.
Voorbeeld van een "start.par" -bestand
Als u uw fitparameters uit een bestand laadt, moet u hierin alle parameters opgeven die u gaat gebruiken en, indien nodig, initialiseren.
## Start parameters for the fit of data.dat
m = -0.0005
q = -0.0005
d = 1.02
Tc = 45.0
g_d = 1.0
b = 0.01002
Fit: eenvoudige lineaire interpolatie van een dataset
Het basisgebruik van fit kan het beste worden verklaard door een eenvoudig voorbeeld:
f(x) = a + b*x + c*x**2 fit [-234:320][0:200] f(x) ’measured.dat’ using 1:2 skip 4 via a,b,c plot ’measured.dat’ u 1:2, f(x)
Er kunnen bereiken worden opgegeven om de gegevens te filteren die bij het aanpassen worden gebruikt. Gegevensbereik buiten bereik worden genegeerd. (T. Williams, C. Kelley - gnuplot 5.0, een interactief plotprogramma )
Lineaire interpolatie (passend bij een lijn) is de eenvoudigste manier om een gegevensset te passen. Stel dat u een gegevensbestand hebt waarvan de groei van uw y-hoeveelheid lineair is, kunt u gebruiken
[...] lineaire veeltermen om nieuwe datapunten te construeren binnen het bereik van een discrete set bekende datapunten. (van Wikipedia, lineaire interpolatie )
Voorbeeld met een polynoom van de eerste graad
We gaan werken met de volgende gegevensset, genaamd house_price.dat
, die de vierkante meters van een huis in een bepaalde stad en de prijs ervan in $ 1000 omvat.
### 'house_price.dat'
## X-Axis: House price (in $1000) - Y-Axis: Square meters (m^2)
245 426.72
312 601.68
279 518.16
308 571.50
199 335.28
219 472.44
405 716.28
324 546.76
319 534.34
255 518.16
Laten we die parameters aanpassen met gnuplot De opdracht zelf is erg eenvoudig, zoals u kunt zien aan de syntaxis, definieer gewoon uw passende prototype en gebruik vervolgens de opdracht fit
om het resultaat te krijgen:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Maar het kan interessant zijn om de verkregen parameters ook in de plot zelf te gebruiken. De onderstaande code past in het bestand house_price.dat
en plot vervolgens de parameters m
en q
om de beste house_price.dat
van de gegevensset te verkrijgen. Als u eenmaal de parameters hebt, kunt u de y-value
berekenen, in dit geval de huisprijs , van een willekeurige x-vaule
( vierkante meter van het huis) die gewoon in de formule wordt vervangen
y = m * x + q
de juiste x-value
. Laten we de code becommentariëren.
0. De termijn instellen
set term pos col
set out 'house_price_fit.ps'
1. Gewoon beheer om de grafiek te verfraaien
set title 'Linear Regression Example Scatterplot'
set ylabel 'House price (k$ = $1000)'
set xlabel 'Square meters (m^2)'
set style line 1 ps 1.5 pt 7 lc 'red'
set style line 2 lw 1.5 lc 'blue'
set grid
set key bottom center box height 1.4
set xrange [0:450]
set yrange [0:]
2. De juiste pasvorm
Hiervoor hoeven we alleen de opdrachten te typen:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Opslaan van m
en q
waarden in een string en plotten
Hier gebruiken we de sprintf
functie om het label (in de object rectangle
het object rectangle
) voor te bereiden waarin we het resultaat van de aanpassing gaan afdrukken. Eindelijk plotten we de hele grafiek.
mq_value = sprintf("Parameters values\nm = %f k$/m^2\nq = %f k$", m, q)
set object 1 rect from 90,725 to 200, 650 fc rgb "white"
set label 1 at 100,700 mq_value
p 'house_price.dat' ls 1 t 'House price', f(x) ls 2 t 'Linear regression'
set out
De uitvoer ziet er zo uit.