Gnuplot
Dopasuj dane za pomocą gnuplot
Szukaj…
Wprowadzenie
Polecenie dopasowania może dopasować funkcję zdefiniowaną przez użytkownika do zestawu punktów danych (x,y)
lub (x,y,z)
, wykorzystując implementację nieliniowego algorytmu najmniejszych kwadratów ( NLLS ) Marquardta-Levenberga.
Każda zmienna zdefiniowana przez użytkownika występująca w treści funkcji może służyć jako parametr dopasowania, ale zwracany typ funkcji musi być prawdziwy.
Składnia
- fit [ xrange ] [ yrange ] funkcja „ plik danych ” za pomocą modyfikatora za pomocą pliku parametrycznego
Parametry
Parametry | Szczegół |
---|---|
Parametry dopasowania a , b , c oraz dowolną literę, która nie była wcześniej używana | Użyj liter, aby przedstawić parametry, które będą użyte do dopasowania funkcji. Np .: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
Parametry pliku start.par | Zamiast używać niezainicjowanych parametrów (Marquardt-Levenberg automatycznie zainicjuje dla ciebie a=b=c=...=1 ), możesz umieścić je w pliku start.par i wywołać je w sekcji parametr_plik . Np .: fit f(x) 'data.dat' u 1:2 via 'start.par' . Przykład pliku start.par pokazano poniżej |
Uwagi
Krótkie wprowadzenie
fit
służy do znalezienia zestawu parametrów, które „najlepiej” pasują do twoich danych do funkcji zdefiniowanej przez użytkownika. Dopasowanie ocenia się na podstawie sumy kwadratów różnic lub „reszt” (SSR) między wejściowymi punktami danych a wartościami funkcji, ocenianych w tych samych miejscach. Ilość ta jest często nazywana „chisquare” (tj. Grecka litera chi, do potęgi 2). Algorytm próbuje zminimalizować SSR, a ściślej WSSR, ponieważ reszty są „ważone” przez błędy danych wejściowych (lub 1,0), zanim zostaną podniesione do kwadratu. ( Ibidem )
Plik fit.log
Po każdym kroku iteracji podawane są szczegółowe informacje o stanie dopasowania zarówno na ekranie, jak i w tak zwanym pliku dziennika fit.log
. Ten plik nigdy nie zostanie usunięty, ale zawsze dołączany, aby historia dopasowania nie została utracona.
Dopasowanie danych z błędami
Może istnieć do 12 zmiennych niezależnych, zawsze jest 1 zmienna zależna i można dopasować dowolną liczbę parametrów. Opcjonalnie można wprowadzić szacunki błędów w celu ważenia punktów danych. (T. Williams, C. Kelley - gnuplot 5.0, An Interactive Plotting Program )
Jeśli masz zestaw danych i chcesz dopasować, jeśli polecenie jest bardzo proste i naturalne:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
gdzie zamiast tego f(x)
może być również f(x, y)
. W przypadku, gdy masz również oszacowania błędu danych, po prostu dodaj {y | xy | z}errors
( { | }
reprezentują możliwe opcje) w opcji modyfikatora (patrz Składnia) . Na przykład
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
gdzie {y | xy | z}errors
Opcja {y | xy | z}errors
wymaga odpowiednio 1 ( y
), 2 ( xy
), 1 ( z
) kolumny, które określają wartość oszacowania błędu.
Dopasowanie wykładnicze z xyerrors
pliku
Oszacowania błędu danych są wykorzystywane do obliczania względnej masy każdego punktu danych przy określaniu ważonej sumy kwadratów reszt, WSSR lub chisquare. Mogą wpływać na oszacowania parametrów, ponieważ określają, jak duży wpływ ma odchylenie każdego punktu danych od dopasowanej funkcji na wartości końcowe. Niektóre informacje o dopasowaniu wyjściowym, w tym oszacowania błędu parametru, są bardziej znaczące, jeśli podano dokładne oszacowania błędu danych. ( Ibidem )
Weźmy przykładowy zestaw danych measured.dat
, złożony z 4 kolumn: współrzędnych osi x ( Temperature (K)
), współrzędnych osi y ( Pressure (kPa)
), szacunków błędu x ( T_err (K)
) i oszacowania błędu 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
Teraz skomponuj prototyp funkcji, która z teorii powinna przybliżać nasze dane. W tym przypadku:
Z = 0.001
f(x) = W * exp(x * Z)
gdzie zainicjowaliśmy parametr Z
ponieważ w przeciwnym razie ocena funkcji wykładniczej exp(x * Z)
daje ogromne wartości, co prowadzi do (zmiennoprzecinkowej) nieskończoności i NaN w algorytmie dopasowania Marquardta-Levenberga, zwykle nie trzeba inicjować zmienne - spójrz tutaj , jeśli chcesz dowiedzieć się więcej o Marquardt-Levenberg.
Czas dopasować dane!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Wynik będzie wyglądał
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
Gdzie teraz W
i Z
są wypełnione pożądanymi parametrami i szacunkami błędów na nich.
Poniższy kod tworzy następujący wykres.
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'
Rysuj z dopasowaniem measured.dat
Użycie polecenia with xyerrorbars
wyświetli oszacowania błędów na x i y. set grid
umieści przerywaną siatkę na głównych tikach.
W przypadku gdy oszacowania błędów nie są dostępne lub są nieistotne, możliwe jest również dopasowanie danych bez {y | xy | z}errors
opcja dopasowania {y | xy | z}errors
:
fit f(x) "measured.dat" u 1:2 via W, Z
W tym przypadku należało również unikać xyerrorbars
.
Przykład pliku „start.par”
Jeśli ładujesz parametry dopasowania z pliku, powinieneś zadeklarować w nim wszystkie parametry, których zamierzasz użyć i, w razie potrzeby, zainicjować je.
## 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
Dopasowanie: podstawowa interpolacja liniowa zestawu danych
Podstawowe użycie dopasowania najlepiej wyjaśnić prostym przykładem:
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)
Można określić zakresy do filtrowania danych używanych w łączeniu. Punkty danych poza zasięgiem są ignorowane. (T. Williams, C. Kelley - gnuplot 5.0, An Interactive Plotting Program )
Interpolacja liniowa (dopasowanie z linią) jest najprostszym sposobem dopasowania zestawu danych. Załóżmy, że masz plik danych, w którym przyrost ilości y jest liniowy, możesz użyć
[...] liniowe wielomiany do tworzenia nowych punktów danych w zakresie dyskretnego zestawu znanych punktów danych. (z Wikipedii, Interpolacja liniowa )
Przykład z wielomianem pierwszej klasy
Będziemy pracować z następującym zestawem danych, o nazwie house_price.dat
, który obejmuje metry kwadratowe domu w danym mieście i jego cenę w wysokości 1000 USD.
### '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
Dopasujmy te parametry za pomocą gnuplot. Samo polecenie jest bardzo proste, jak można zauważyć po składni, wystarczy zdefiniować odpowiedni prototyp, a następnie użyć polecenia fit
aby uzyskać wynik:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Ale może być interesujące również wykorzystanie uzyskanych parametrów w samym wykresie. Poniższy kod pasuje do pliku house_price.dat
, a następnie wykreśla parametry m
i q
, aby uzyskać najlepsze przybliżenie krzywej zestawu danych. Po uzyskaniu parametrów można obliczyć wartość y-value
, w tym przypadku cenę domu , z dowolnej podanej wartości x-vaule
( metrów kwadratowych domu), po prostu zastępując formułę
y = m * x + q
odpowiednia x-value
. Skomentujmy kod.
0. Ustawienie terminu
set term pos col
set out 'house_price_fit.ps'
1. Zwykłe podawanie do upiększania wykresu
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. Właściwe dopasowanie
W tym celu będziemy musieli jedynie wpisać polecenia:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Zapisywanie wartości m
i q
w ciągu znaków i kreślenie
Tutaj używamy funkcji sprintf
do przygotowania etykiety (umieszczonej w object rectangle
), w której wydrukujemy wynik dopasowania. Na koniec wykreślamy cały wykres.
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
Wynik będzie wyglądał następująco.