Gnuplot
Anpassa data med gnuplot
Sök…
Introduktion
Passningskommandot kan anpassa en användardefinierad funktion till en uppsättning datapunkter (x,y)
eller (x,y,z)
, med hjälp av en implementering av den icke-linjära minsta kvadraten ( NLLS ) Marquardt-Levenberg-algoritmen.
Varje användardefinierad variabel som förekommer i funktionskroppen kan fungera som en passningsparameter, men funktionens returtyp måste vara verklig.
Syntax
- passa [ xrange ] [ yrange ] -funktionen " datafile " med modifierare via parameter_file
parametrar
parametrar | Detalj |
---|---|
Montering av parametrar a , b , c och alla bokstäver som inte använts tidigare | Använd bokstäver för att representera parametrar som kommer att användas för att passa en funktion. Exempel: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
start.par | Istället använder du uninitialiserade parametrar (Marquardt-Levenberg kommer automatiskt att initialisera för dig a=b=c=...=1 ) kan du lägga dem i en fil start.par och de ringer med i avsnittet parameter_fil . Exempel: fit f(x) 'data.dat' u 1:2 via 'start.par' . Ett exempel på filen start.par visas nedan |
Anmärkningar
Kort introduktion
fit
används för att hitta en uppsättning parametrar som "bäst" passar dina data till din användardefinierade funktion. Passningen bedöms utifrån summan av kvadratdifferenser eller "rester" (SSR) mellan ingångsdatapunkterna och funktionsvärdena, utvärderade på samma platser. Denna mängd kallas ofta "chisquare" (dvs. den grekiska bokstaven chi, till kraften av 2). Algoritmen försöker minimera SSR, eller mer exakt, WSSR, eftersom resterna är "viktade" av inmatningsdatafel (eller 1.0) innan de kvadreras. ( Ibidem )
fit.log
filen
Efter varje iterationssteg ges en detaljerad info om passningens tillstånd både på skärmen och om en så kallad log-fil fit.log
. Denna fil kommer aldrig att raderas men alltid bifogas så att passens historik inte går förlorad.
Montering av data med fel
Det kan finnas upp till 12 oberoende variabler, det finns alltid en beroende variabel, och valfritt antal parametrar kan monteras. Valfritt kan feluppskattningar matas in för viktning av datapunkterna. (T. Williams, C. Kelley - gnuplot 5.0, ett interaktivt planeringsprogram )
Om du har en datauppsättning och vill passa om kommandot är väldigt enkelt och naturligt:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
där i stället f(x)
kan vara f(x, y)
. Om du också har datafeluppskattningar, lägg bara till {y | xy | z}errors
( { | }
representerar de möjliga valen) i modifieringsalternativet (se Syntax) . Till exempel
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
där {y | xy | z}errors
kräver respektive 1 ( y
), 2 ( xy
), 1 ( z
) kolumn som anger värdet på feluppskattningen.
Exponentiell montering med xyerrors
i en fil
Uppskattningar av datafel används för att beräkna den relativa vikten för varje datapunkt vid bestämning av den vägda summan av kvadratrester, WSSR eller chisquare. De kan påverka parameteruppskattningarna, eftersom de avgör hur mycket påverkan avvikelsen för varje datapunkt från den monterade funktionen har på de slutliga värdena. En del av informationen om passningsutgång, inklusive uppskattningar av parameterfel, är mer meningsfull om exakta datafeluppskattningar har tillhandahållits .. ( Ibidem )
Vi tar en provdatauppsättning measured.dat
, uppbyggd av fyra kolumner: x-axelkoordinaterna ( Temperature (K)
), y-axelkoordinaterna ( Pressure (kPa)
), x-felets uppskattningar ( T_err (K)
) och y- 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
Nu är det bara att komponera prototypen för den funktion som från teorin bör ungefärliggöra våra data. I detta fall:
Z = 0.001
f(x) = W * exp(x * Z)
där vi har initialiserat parametern Z
eftersom annars utvärdering av exponentiell funktion exp(x * Z)
resulterar i enorma värden, vilket leder till (flytande punkt) Infinity och NaN i Marquardt-Levenberg montering algoritm, vanligtvis behöver du inte initialisera variabler - titta här om du vill veta mer om Marquardt-Levenberg.
Det är dags att anpassa data!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Resultatet kommer att se ut
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
Där nu W
och Z
är fyllda med de önskade parametrarna och felberäkningarna för dessa.
Koden nedan ger följande graf.
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'
Plot med anpassning av measured.dat
Användning av kommandot with xyerrorbars
visar with xyerrorbars
på x och på y. set grid
kommer att placera ett streckat rutnät på de stora tics.
Om feluppskattningarna inte är tillgängliga eller obetydliga är det också möjligt att anpassa data utan {y | xy | z}errors
felsättningsalternativ:
fit f(x) "measured.dat" u 1:2 via W, Z
I detta fall xyerrorbars
också undvikas.
Exempel på "start.par" -fil
Om du laddar dina passningsparametrar från en fil, bör du förklara alla parametrar som du kommer att använda och vid behov initiera dem.
## 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
Passform: grundläggande linjär interpolering av ett datasæt
Den grundläggande användningen av passform förklaras bäst med ett enkelt exempel:
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)
Områden kan anges för att filtrera de data som används vid montering. Datapunkter utanför området ignoreras. (T. Williams, C. Kelley - gnuplot 5.0, ett interaktivt planeringsprogram )
Linjär interpolation (montering med en linje) är det enklaste sättet att anpassa en datamängd. Antag att du har en datafil där tillväxten av din y-kvantitet är linjär kan du använda
[...] linjära polynomier för att konstruera nya datapunkter inom området för en diskret uppsättning kända datapunkter. (från Wikipedia, Linjär interpolation )
Exempel med en förstklassig polynom
Vi kommer att arbeta med följande house_price.dat
, som heter house_price.dat
, som inkluderar kvadratmeter av ett hus i en viss stad och dess pris i 1000 dollar.
### '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
Låt oss anpassa dessa parametrar med gnuplot Selve kommandot är mycket enkelt, eftersom du kan se från syntaxen, definiera bara din passande prototyp och använd sedan fit
kommandot för att få resultatet:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Men det kan vara intressant också att använda de erhållna parametrarna i själva tomten. Koden nedan passar filen house_price.dat
och plottar sedan parametrarna m
och q
att få den bästa kurvan tillnärmningen av datauppsättningen. När du har parametrarna kan du beräkna y-value
, i detta fall huspriset , från en given x-vaule
( kvadratmeter av huset) som bara ersätter formeln
y = m * x + q
lämpligt x-value
. Låt oss kommentera koden.
0. Ställa in termen
set term pos col
set out 'house_price_fit.ps'
1. Vanlig administration för att utsmycka graf
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. Rätt passform
För detta behöver vi bara skriva kommandona:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Spara m
och q
värden i en sträng och plotta
Här använder vi sprintf
funktionen för att förbereda etiketten (i rutan i object rectangle
) där vi ska skriva ut resultatet av passformen. Slutligen plottar vi hela diagrammet.
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
Utgången ser ut så här.