Recherche…


Introduction

La commande ajustement peut ajuster une fonction définie par l' utilisateur à un ensemble de points de données (x,y) ou (x,y,z) , en utilisant une implémentation de la méthode des moindres carrés non linéaire (NLLS) algorithme de Levenberg-Marquardt.

Toute variable définie par l'utilisateur apparaissant dans le corps de la fonction peut servir de paramètre d'ajustement, mais le type de retour de la fonction doit être réel.

Syntaxe

  • adapter [xrange] [yrange] fonction "fichier de données" en utilisant le modificateur via parameter_file

Paramètres

Paramètres Détail
Paramètres d'ajustement a , b , c et toute lettre qui n'a pas été utilisée précédemment Utilisez des lettres pour représenter les paramètres qui seront utilisés pour adapter une fonction. Ex: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y
Paramètres de fichier start.par Au lieu d'utiliser des paramètres non initialisés (le Marquardt-Levenberg initialise automatiquement pour vous a=b=c=...=1 ), vous pouvez les placer dans un fichier start.par et les appeler dans la section parameter_file . Ex: fit f(x) 'data.dat' u 1:2 via 'start.par' . Un exemple pour le fichier start.par est montré ci-dessous

Remarques

Brève introduction

fit est utilisé pour trouver un ensemble de paramètres qui correspondent le mieux à vos données à votre fonction définie par l'utilisateur. L'ajustement est jugé sur la base de la somme des différences au carré ou des «résidus» (SSR) entre les points de données d'entrée et les valeurs de fonction, évaluées aux mêmes endroits. Cette quantité est souvent appelée «chisquare» (c'est-à-dire la lettre grecque chi, à la puissance de 2). L'algorithme tente de minimiser le SSR, ou plus précisément le WSSR, car les résidus sont "pondérés" par les erreurs de données d'entrée (ou 1.0) avant d'être mis au carré. ( Ibidem )

Le fichier fit.log

Après chaque étape d'itération, une information détaillée est donnée sur l'état de l'ajustement à la fois sur l'écran et sur ce que l'on appelle le fichier journal fit.log . Ce fichier ne sera jamais effacé mais toujours ajouté pour que l'historique de l'ajustement ne soit pas perdu.

Ajustement des données avec des erreurs

Il peut y avoir jusqu'à 12 variables indépendantes, il y a toujours une variable dépendante et un nombre quelconque de paramètres peut être ajusté. En option, des estimations d'erreur peuvent être entrées pour pondérer les points de données. (T. Williams, C. Kelley - gnuplot 5.0, un programme de traçage interactif )

Si vous avez un ensemble de données et que vous souhaitez l'ajuster si la commande est très simple et naturelle:

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

où plutôt f(x) pourrait être aussi f(x, y) . Si vous avez également des estimations d’erreurs de données, ajoutez simplement le {y | xy | z}errors ( { | } représentent les choix possibles) dans l'option modificateur (voir Syntaxe) . Par exemple

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

où le {y | xy | z}errors options d' {y | xy | z}errors nécessitent respectivement 1 ( y ), 2 ( xy ), 1 ( z ) colonne spécifiant la valeur de l'estimation de l'erreur.

xyerrors exponentiel avec xyerrors d'un fichier

Les estimations d'erreur de données sont utilisées pour calculer le poids relatif de chaque point de données lors de la détermination de la somme pondérée des résidus au carré, WSSR ou chisquare. Ils peuvent affecter les estimations des paramètres, car ils déterminent l'influence de la déviation de chaque point de données par rapport à la fonction ajustée sur les valeurs finales. Certaines des informations d'ajustement, y compris les estimations des erreurs de paramètres, sont plus significatives si des estimations précises des erreurs de données ont été fournies. ( Ibidem )

Nous prendrons un ensemble de données échantillonné measured.dat , composé de 4 colonnes: les coordonnées de l'axe des abscisses ( Temperature (K) ), les coordonnées de l'axe des ordonnées ( Pressure (kPa) ), les estimations d'erreur x ( T_err (K) ) et les estimations d'erreur 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

Maintenant, il suffit de composer le prototype de la fonction qui, d'après la théorie, devrait se rapprocher de nos données. Dans ce cas:

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

où nous avons initialisé le paramètre Z car, sinon, évaluer la fonction exponentielle exp(x * Z) donne des valeurs énormes, ce qui conduit à Infinity et NaN dans l’algorithme d’adaptation de Marquardt-Levenberg, vous n’avez généralement pas besoin d’initialiser variables - regardez ici , si vous voulez en savoir plus sur Marquardt-Levenberg.

Il est temps d'adapter les données!

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

Le résultat ressemblera

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 

Où maintenant W et Z sont remplis avec les paramètres désirés et les erreurs estimées sur ceux-là.

Le code ci-dessous produit le graphique suivant.

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'

Terrain avec ajustement de measured.dat En utilisant la commande with xyerrorbars affiche des erreurs sur les estimations x et des y. set grid placera une grille en pointillés sur les tics principaux. Ajustement exponentiel

Dans le cas où les estimations d'erreur ne sont pas disponibles ou sont sans importance, il est également possible d'adapter les données sans {y | xy | z}errors correspondant à l'option:

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

Dans ce cas, les xyerrorbars devaient également être évités.

Exemple de fichier "start.par"

Si vous chargez vos paramètres d'ajustement à partir d'un fichier, vous devez déclarer tous les paramètres que vous allez utiliser et, le cas échéant, les initialiser.

## 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: interpolation linéaire de base d'un ensemble de données

L'utilisation simple de l'ajustement s'explique mieux par un exemple simple:

 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)

Des plages peuvent être spécifiées pour filtrer les données utilisées lors du montage. Les points de données hors plage sont ignorés. (T. Williams, C. Kelley - gnuplot 5.0, un programme de traçage interactif )

L'interpolation linéaire (ajustée avec une ligne) est la manière la plus simple d'adapter un ensemble de données. Supposons que vous ayez un fichier de données où la croissance de votre quantité y est linéaire, vous pouvez utiliser

polynômes linéaires pour construire de nouveaux points de données dans la gamme d'un ensemble discret de points de données connus. (extrait de Wikipedia, interpolation linéaire )

Exemple avec un polynôme de première classe

Nous allons travailler avec le jeu de données suivant, appelé house_price.dat , qui comprend les mètres carrés d'une maison dans une certaine ville et son prix en 1000 dollars.

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

Nous allons adapter ces paramètres avec gnuplot La commande elle-même est très simple, comme vous pouvez le constater avec la syntaxe, définissez simplement votre prototype, puis utilisez la commande fit pour obtenir le résultat:

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

Mais il pourrait être intéressant d'utiliser également les paramètres obtenus dans l'intrigue elle-même. Le code ci-dessous correspond au fichier house_price.dat , puis trace les paramètres m et q pour obtenir la meilleure approximation de la courbe de l'ensemble de données. Une fois que vous avez les paramètres, vous pouvez calculer la y-value , dans ce cas le prix Maison , à partir de n'importe quelle x-vaule ( mètres carrés de la maison) en remplaçant simplement la formule

y = m * x + q

la x-value appropriée. Commentons le code.

0. Définition du terme

set term pos col
set out 'house_price_fit.ps'

1. Administration ordinaire pour embellir le graphique

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. Le bon ajustement

Pour cela, il suffit de taper les commandes:

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

3. Enregistrement des valeurs m et q dans une chaîne et tracé

Ici, nous utilisons la fonction sprintf pour préparer l'étiquette (encadrée dans le object rectangle ) dans laquelle nous allons imprimer le résultat de l'ajustement. Enfin, nous traçons le graphique entier.

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 sortie ressemblera à ceci.

L'ajustement



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow