Suche…


Einführung

Der Fit-Befehl kann eine benutzerdefinierte Funktion an eine Menge von Datenpunkten (x,y) oder (x,y,z) anpassen , wobei eine Implementierung des nichtlinearen Least -Squares-Algorithmus ( NLLS ) von Marquardt-Levenberg verwendet wird.

Jede im Funktionskörper vorkommende benutzerdefinierte Variable kann als Fit-Parameter dienen, der Rückgabetyp der Funktion muss jedoch reell sein.

Syntax

  • fit [ xrange ] [ yrange ] Funktion " Datendatei " mit Modifikator über Parameterdatei

Parameter

Parameter Detail
Anpassungsparameter a , b , c und alle Buchstaben, die zuvor nicht verwendet wurden Verwenden Sie Buchstaben, um Parameter darzustellen, die für eine Funktion verwendet werden. Zum Beispiel: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y
start.par Verwenden Sie stattdessen nicht initialisierte Parameter (der Marquardt-Levenberg initialisiert automatisch für Sie a=b=c=...=1 ), können Sie diese in eine Datei start.par und sie im Abschnitt parameter_file aufrufen. Beispiel: fit f(x) 'data.dat' u 1:2 via 'start.par' . Ein Beispiel für die Datei start.par ist unten gezeigt

Bemerkungen

Kurze Einführung

fit wird verwendet, um einen Parametersatz zu finden, der Ihre Daten am besten an Ihre benutzerdefinierte Funktion anpasst. Die Anpassung wird anhand der Summe der quadrierten Differenzen oder 'Residuen' (SSR) zwischen den Eingabedatenpunkten und den Funktionswerten beurteilt, die an denselben Stellen bewertet werden. Diese Menge wird häufig als "chisquare" (dh der griechische Buchstabe chi in Potenz von 2) bezeichnet. Der Algorithmus versucht, SSR oder genauer WSSR zu minimieren, da die Residuen vor dem Quadrieren mit den Eingangsdatenfehlern (oder 1,0) "gewichtet" werden. ( Ibidem )

Die Datei fit.log

Nach jedem Iterationsschritt werden detaillierte Informationen zum Status der Anpassung sowohl auf dem Bildschirm als auch in einer sogenannten Protokolldatei fit.log . Diese Datei wird niemals gelöscht, sondern immer angehängt, damit der Verlauf des Anpassen nicht verloren geht.

Daten mit Fehlern anpassen

Es können bis zu 12 unabhängige Variablen vorhanden sein, es gibt immer 1 abhängige Variable und es können beliebig viele Parameter angepasst werden. Optional können Fehlerschätzungen zur Gewichtung der Datenpunkte eingegeben werden. (T. Williams, C. Kelley - gnuplot 5.0, ein interaktives Plotprogramm )

Wenn Sie einen Datensatz haben und passen möchten, wenn der Befehl sehr einfach und natürlich ist:

fit f(x) "data_set.dat" using 1:2 via par1, par2, par3

wo stattdessen f(x) auch f(x, y) . Falls Sie auch Datenfehler haben, fügen Sie einfach das {y | xy | z}errors ( { | } stellen die möglichen Optionen dar) in der Modifier- Option (siehe Syntax) . Zum Beispiel

fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3

wo das {y | xy | z}errors Option {y | xy | z}errors erfordert eine Spalte von 1 ( y ), 2 ( xy ), 1 ( z ), die den Wert der Fehlerschätzung angibt.

Exponentielle Anpassung mit xyerrors einer Datei

Datenfehlerschätzungen werden verwendet, um die relative Gewichtung jedes Datenpunkts zu berechnen, wenn die gewichtete Summe der quadrierten Residuen, WSSR oder Chi-Quadrat bestimmt wird. Sie können die Parameterschätzungen beeinflussen, da sie bestimmen, wie stark die Abweichung jedes Datenpunkts von der angepassten Funktion die endgültigen Werte beeinflusst. Einige der Anpassungsausgabeinformationen, einschließlich der Parameterfehlerschätzungen, sind aussagekräftiger, wenn genaue Datenfehlerschätzungen bereitgestellt wurden. ( Ibidem )

Wir nehmen einen Beispieldatensatz mit dem Namen measured.dat , der aus 4 Spalten besteht: die x-Achsen-Koordinaten ( Temperature (K) ), die y-Achsen-Koordinaten ( Pressure (kPa) ), die x-Fehlerschätzungen ( T_err (K) ) und die y-Fehlerschätzungen ( 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

Nun stellen Sie einfach den Prototyp der Funktion zusammen, die aus der Theorie unseren Daten entsprechen sollte. In diesem Fall:

Z = 0.001
f(x) = W * exp(x * Z)

Dabei haben wir den Parameter Z initialisiert, da die Auswertung der Exponentialfunktion exp(x * Z) ansonsten zu großen Werten führt, die zu (Fließkommazahl) Infinity und NaN im Marquardt-Levenberg-Anpassungsalgorithmus führen Variablen - schauen Sie hier , wenn Sie mehr über Marquardt-Levenberg erfahren möchten.

Es ist Zeit, die Daten anzupassen!

fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z

Das Ergebnis wird aussehen

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 

Wobei jetzt W und Z mit den gewünschten Parametern gefüllt sind und Fehler auf diese geschätzt werden.

Der folgende Code erzeugt das folgende Diagramm.

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'

Plotten mit Passung von measured.dat Wenn Sie den Befehl with xyerrorbars werden with xyerrorbars für x und y angezeigt. set grid wird ein gestricheltes Raster auf die wichtigsten Tics setzen. Exponentielle Passform

Falls Fehlerschätzungen nicht verfügbar oder unwichtig sind, ist es möglich, auch Daten ohne das {y | xy | z}errors :

fit f(x) "measured.dat" u 1:2 via W, Z

In diesem Fall mussten auch die xyerrorbars vermieden werden.

Beispiel für die Datei "start.par"

Wenn Sie Ihre Anpassungsparameter aus einer Datei laden, sollten Sie alle zu verwendenden Parameter darin angeben und sie bei Bedarf initialisieren.

## 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: grundlegende lineare Interpolation eines Datensatzes

Die grundlegende Verwendung von Fit lässt sich am besten durch ein einfaches Beispiel erklären:

 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)

Es können Bereiche angegeben werden, um die bei der Anpassung verwendeten Daten zu filtern. Datenpunkte außerhalb des Bereichs werden ignoriert. (T. Williams, C. Kelley - gnuplot 5.0, ein interaktives Plotprogramm )

Die lineare Interpolation (Anpassung an eine Linie) ist die einfachste Möglichkeit, einen Datensatz anzupassen. Angenommen, Sie haben eine Datendatei, in der das Wachstum Ihrer y-Menge linear ist, können Sie verwenden

[...] lineare Polynome, um neue Datenpunkte innerhalb eines diskreten Satzes bekannter Datenpunkte zu erstellen. (aus Wikipedia, Lineare Interpolation )

Beispiel mit einem Polynom ersten Grades

Wir werden mit dem folgenden Datensatz, house_price.dat , house_price.dat , der die Quadratmeter eines Hauses in einer bestimmten Stadt und seinen Preis in USD 1000 beinhaltet.

### '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

Passen Sie diese Parameter mit gnuplot an. Der Befehl selbst ist sehr einfach, wie Sie anhand der Syntax feststellen können, definieren Sie einfach Ihren passenden Prototyp und verwenden Sie dann den Befehl fit , um das Ergebnis zu erhalten:

## m, q will be our fitting parameters
f(x) = m * x + q       
fit f(x) 'data_set.dat' using 1:2 via m, q

Es könnte aber auch interessant sein, die ermittelten Parameter in der Grafik selbst zu verwenden. Der nachstehende Code passt in die Datei house_price.dat und house_price.dat die Parameter m und q auf, um die beste Kurvenannäherung des Datensatzes zu erhalten. Sobald Sie über die Parameter verfügen, können Sie den y-value , in diesem Fall den Hauspreis , aus einem beliebigen x-vaule ( Quadratmeter des Hauses) berechnen, der nur in der Formel verwendet wird

y = m * x + q

der entsprechende x-value . Lassen Sie uns den Code kommentieren.

0. Einstellung des Begriffs

set term pos col
set out 'house_price_fit.ps'

1. Ordentliche Verwaltung zum Verschönern der Grafik

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. Die richtige Passform

Dafür müssen wir nur die Befehle eingeben:

f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q

3. Speichern von m und q Werten in einem String und Plotten

Hier verwenden wir die sprintf Funktion, um das Etikett (in das object rectangle sprintf vorzubereiten, in dem das Ergebnis der Anpassung gedruckt werden soll. Zum Schluss zeichnen wir die gesamte Grafik.

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

Die Ausgabe wird so aussehen.

Die Passform



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow