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. Exponentiële pasvorm

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.

De pasvorm



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow