Gnuplot
Ajustar datos con gnuplot
Buscar..
Introducción
El comando de ajuste puede ajustar una función definida por el usuario a un conjunto de puntos de datos (x,y)
o (x,y,z)
, utilizando una implementación del algoritmo de Marquardt-Levenberg de mínimos cuadrados no lineales ( NLLS ).
Cualquier variable definida por el usuario que aparezca en el cuerpo de la función puede servir como un parámetro de ajuste, pero el tipo de retorno de la función debe ser real.
Sintaxis
- encajar [xrange] [yrange] función "fichero de datos" utilizando modificador a través de parameter_file
Parámetros
Parámetros | Detalle |
---|---|
Ajustar los parámetros a , b , c cualquier letra que no haya sido utilizada anteriormente | Use letras para representar parámetros que se usarán para ajustar una función. Por ejemplo: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
Parámetros de archivo start.par | En lugar de usar parámetros sin inicializar (Marquardt-Levenberg se iniciará automáticamente para usted a=b=c=...=1 ) puede ponerlos en un archivo start.par y llamarlos en la sección de archivo de parámetros . Por ejemplo: fit f(x) 'data.dat' u 1:2 via 'start.par' . A continuación se muestra un ejemplo del archivo start.par |
Observaciones
Breve introducción
fit
se usa para encontrar un conjunto de parámetros que "mejor" ajusta sus datos a su función definida por el usuario. El ajuste se juzga sobre la base de la suma de las diferencias al cuadrado o 'residuos' (SSR) entre los puntos de datos de entrada y los valores de la función, evaluados en los mismos lugares. Esta cantidad a menudo se llama 'chisquare' (es decir, la letra griega chi, con el poder de 2). El algoritmo intenta minimizar el SSR, o más precisamente, el WSSR, ya que los residuos son "ponderados" por los errores de los datos de entrada (o 1.0) antes de cuadrarlos. ( Ibidem )
El archivo fit.log
Después de cada paso de la iteración, se proporciona información detallada sobre el estado del ajuste tanto en la pantalla como en el llamado archivo de registro fit.log
. Este archivo nunca se borrará sino que siempre se agregará para que el historial de ajuste no se pierda.
Ajuste de datos con errores.
Puede haber hasta 12 variables independientes, siempre hay 1 variable dependiente y se puede ajustar cualquier número de parámetros. Opcionalmente, se pueden ingresar estimaciones de error para ponderar los puntos de datos. (T. Williams, C. Kelley - gnuplot 5.0, un programa de trazado interactivo )
Si tiene un conjunto de datos y desea ajustar si el comando es muy simple y natural:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
donde en cambio f(x)
podría ser también f(x, y)
. En el caso de que también tengas estimaciones de error de datos, simplemente agrega {y | xy | z}errors
( { | }
representan las opciones posibles) en la opción de modificador (ver Sintaxis) . Por ejemplo
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
donde el {y | xy | z}errors
opción de {y | xy | z}errors
requiere, respectivamente, 1 ( y
), 2 ( xy
), 1 ( z
) columna que especifique el valor de la estimación de error.
xyerrors
exponencial con xyerrors
de un archivo.
Las estimaciones de error de datos se utilizan para calcular el peso relativo de cada punto de datos al determinar la suma ponderada de los residuos al cuadrado, WSSR o chisquare. Pueden afectar las estimaciones de los parámetros, ya que determinan cuánta influencia tiene la desviación de cada punto de datos de la función ajustada en los valores finales. Parte de la información de salida de ajuste, incluidas las estimaciones de error de parámetros, es más significativa si se proporcionan estimaciones de error de datos precisas .. ( Ibidem )
Tomaremos un conjunto de datos de muestra measured.dat
, compuesto por 4 columnas: las coordenadas del eje x ( Temperature (K)
), las coordenadas del eje y ( Pressure (kPa)
), las estimaciones del error x ( T_err (K)
) y las estimaciones de error 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
Ahora, solo componga el prototipo de la función que de la teoría debería aproximar nuestros datos. En este caso:
Z = 0.001
f(x) = W * exp(x * Z)
donde hemos inicializado el parámetro Z
porque, de lo contrario, evaluar la función exponencial exp(x * Z)
genera valores enormes, lo que lleva a (punto flotante) Infinito y NaN en el algoritmo de ajuste de Marquardt-Levenberg, por lo general no es necesario inicializar variables - eche un vistazo aquí , si desea saber más acerca de Marquardt-Levenberg.
¡Es hora de ajustar los datos!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
El resultado se verá como
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
Donde ahora W
y Z
se llenan con los parámetros deseados y las estimaciones de errores en esos.
El siguiente código produce el siguiente gráfico.
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'
Parcela con ajuste de measured.dat
Usando el comando with xyerrorbars
mostrará errores estima en la X y en la y. set grid
colocará una grilla discontinua en los tics principales.
En el caso de que las estimaciones de error no estén disponibles o no sean importantes, también es posible ajustar los datos sin la {y | xy | z}errors
opción de ajuste de {y | xy | z}errors
:
fit f(x) "measured.dat" u 1:2 via W, Z
En este caso los xyerrorbars
también tenían que ser evitados.
Ejemplo de archivo "start.par"
Si carga sus parámetros de ajuste desde un archivo, debe declarar en él todos los parámetros que va a usar y, cuando sea necesario, inicializarlos.
## 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
Ajuste: interpolación lineal básica de un conjunto de datos
El uso básico del ajuste se explica mejor con un simple ejemplo:
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)
Se pueden especificar rangos para filtrar los datos utilizados en el ajuste. Los puntos de datos fuera de rango se ignoran. (T. Williams, C. Kelley - gnuplot 5.0, un programa de trazado interactivo )
La interpolación lineal (ajuste con una línea) es la forma más sencilla de ajustar un conjunto de datos. Supongamos que tiene un archivo de datos donde el crecimiento de su cantidad y es lineal, puede usar
polinomios [...] lineales para construir nuevos puntos de datos dentro del rango de un conjunto discreto de puntos de datos conocidos. (de Wikipedia, interpolación lineal )
Ejemplo con un polinomio de primer grado.
Vamos a trabajar con el siguiente conjunto de datos, llamado house_price.dat
, que incluye los metros cuadrados de una casa en una ciudad determinada y su precio en $ 1000.
### '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
Ajustemos esos parámetros con gnuplot. El comando en sí es muy simple, como se puede observar en la sintaxis, simplemente defina su prototipo de adaptación y luego use el comando de fit
para obtener el resultado:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Pero también podría ser interesante usar los parámetros obtenidos en la propia gráfica. El código siguiente se ajustará al archivo house_price.dat
y luego house_price.dat
los parámetros m
y q
para obtener la mejor aproximación de la curva del conjunto de datos. Una vez que tenga los parámetros, puede calcular el y-value
, en este caso el precio de la casa , a partir de cualquier x-vaule
( metros cuadrados de la casa) simplemente sustituyendo en la fórmula
y = m * x + q
el x-value
apropiado. Comentemos el código.
0. Establecer el término
set term pos col
set out 'house_price_fit.ps'
1. Administración ordinaria para embellecer la gráfica.
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. El ajuste adecuado
Para esto, solo tendremos que escribir los comandos:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Guardar valores m
y q
en una cadena y graficar
Aquí usamos la función sprintf
para preparar la etiqueta (encuadrada en el object rectangle
del object rectangle
) en la que vamos a imprimir el resultado del ajuste. Finalmente trazamos la gráfica completa.
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
La salida se verá así.