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. Ajuste exponencial

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í.

El ajuste



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow