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. Exponentiell passform

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.

Passningen



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow