Fichier:Regression pic gaussien dissymetrique bruite.svg
Fichier d’origine (Fichier SVG, nominalement de 478 × 364 pixels, taille : 23 kio)
Ce fichier et sa description proviennent de Wikimedia Commons.
Description
DescriptionRegression pic gaussien dissymetrique bruite.svg |
English: Profile fitting of an asymmetrical noisy gaussian peak, by Gauss-Newton regression. Created with Scilab, processed with Inkscape.
Français : Ajustement de profil d'un pic gaussien dissymétrique bruité, par régression en utilisant l'algorithme de Gauss-Newton. Créé par Scilab, modifié par Inkscape. |
Date | |
Source | Travail personnel |
Auteur | Cdang |
Autres versions | Animated GIF: File:Regression pic assymetrique.gif. Savitzky-Golay smoothing and derivation of raw data: File:Savitzky-golay pic gaussien dissymetrique bruite.svg |
Scilab source
This media was created with Scilab, a free open-source software. Here is a listing of the Scilab source used to create this file. |
Fichier fonctions_communes.sce
.
function [y] = gauss_dissym(A, x)
// génère un pic gaussien dissymétrique
// entrées : A(1) : position du pic
// A(2) : hauteur de la courbe
// A(3) : largeur de la courbe à gauche
// A(4) : largeur de la courbe à droite
// x : vecteur de nombres
// sorties : y : vecteur de nombres
indice = (x < A(1)); // vecteur de %t à gauche, %f à droite
y = zeros(x); // initialisation
y(indice) = A(2)*exp(-(x(indice) - A(1)).^2/A(3)); // profil gauche
y(~indice) = A(2)*exp(-(x(~indice) - A(1)).^2/A(4)); // profil droit
endfunction
function [B] = linearisation_approchee(f, A, x, deltaA)
// calcule une valeur approchée de sdérivées partielles de f
// par rapport à ses paramètres A(i)
// f : fonction de x acceptant un vecteur de paramètres A
// sous la forme f = (A,x)
// A : vecteur de paramètres (nombres)
// x : vecteur de nombres
taillex = size(x,'*');
tailleA = size(A, '*');
B = zeros(taillex, tailleA);
for i = 1:tailleA // on ne modifie que le paramètre A(i)
Agauche = [A(1:(i-1)), A(i) - deltaA, A(i+1:$)];
Adroite = [A(1:(i-1)), A(i) + deltaA, A(i+1:$)];
B(:,i) = (f(Adroite, x) - f(Agauche, x))/2/deltaA; // df/dA(i)
end
endfunction
Fichier generateur_pic_gaussien_dissymetrique.sce
: crée le fichier de données pic_gauss_dissym_bruite.txt
.
// **********
// Constantes et initialisation
// **********
clear;
clf;
chdir('monchemin/');
// paramètres de la courbe bruitée
parmgauss(1) = 0; // position du pic
paramgauss(2) = 10; // hauteur de la courbe gaussienne
paramgauss(3) = 1; // largeur de la courbe gaussienne à gauche
paramgauss(4) = 0.3; // largeur de la courbe gaussienne à droite
var = 0.5; // variance de la loi normale
nbpts = 200 // nombre de points
demielargeur = 3*max(paramgauss(3), paramgauss(4)); // pour intervalle x
pas = 2*demielargeur/nbpts;
// **********
// Fonctions
// **********
exec('fonctions_communes.sce', -1)
// **********
// Programme principal
// **********
// Génération des données
for i = 1:nbpts
x = pas*i - demielargeur;
Xinit(i) = x;
bruit(i) = var*rand(1, 'normal');
end
Ybase = gauss_dissym(paramgauss, Xinit);
Yinit = Ybase + bruit;
// Enregistrement des données
// plot(Xinit, Ybase, "r")
// plot(Xinit, Yinit, "b")
write ('pic_gauss_dissym_bruite.txt', [Xinit, Yinit])
Fichier regression_pic_dissymetrique.sce
: traite le fichier de données pic_gauss_dissym_bruite.txt
et détermine les paramètres du modèle par régression. Les paramètres initiaux sont obtenus par lissage et dérivaiton avec l'algorithme de Savitzky-Golay, voir File:Savitzky-golay pic gaussien dissymetrique bruite.svg.
// **********
// Constantes et initialisation
// **********
clear;
clf;
chdir('monchemin/')
// Paramètres de Newton-Raphson
precision = 1e-7; // condition d'arrêt
itermax = 30; // idem
// Précision de la linéarisation approchée
epsilon = 1e-6;
// **********
// Fonctions
// **********
exec('fonctions_communes.sce', -1)
function [e] = res(Yexp, Ycal)
e = sqrt(sum((Yexp-Ycal).^2));
endfunction
function [A, R] = gaussnewton(f, X, Yexp, A0, imax, epsilon)
// A : jeu de paramètres optimisé par régression (vecteur)
// R : liste des facteurs de qualité de la régression
// pour chaque étape (vecteur)
// X : variable explicative (vecteur)
// Yexp : variable expliquée, valeurs mesurées (vecteur)
// A0 : paramètres d'initialisation du modèle (vecteur)
// epsilon : valeur d'arrêt (scalaire)
k = 1; // facteur d'amortissement initial, <=1,
// évite la divergence
n = size(X,'*');
e0 = sqrt(sum(Yexp.^2)); // normalisation du facteur de qualité
Ycal = f(A0, X); // modèle initial
R(1) = res(Yexp, Ycal)/e0; // facteur de qualité initial
disp('i = 1 ; k = 1 ; R = '+string(R(1))) // affichage param initiaux
i = 1;
B = A0;
drapeau = %t;
while (i < imax) & drapeau // teste la convergence globale
i = i+1;
deltay = Yexp - Ycal;
J = linearisation_approchee(f, B, X, epsilon); // matrice jacobienne
tJ = J'; // transposée
drapeau2 = %t // pour une 1re exécution
deltap0 = inv((tJ*J))*tJ*deltay;
while drapeau2 & (k>0.1) // teste la divergence sur 1 étape
deltap = k*deltap0;
Bnouveau = B + deltap';
Ycal = f(Bnouveau, X);
R(i) = res(Yexp, Ycal)/e0;
drapeau2 = (R(i) >= R(i-1)) // vrai si diverge
if drapeau2 then k = k*0.75; // atténue si diverge
else k0 = k; // pour affichage de la valeur
k = (1 + k)/2; // réduit l'atténuation si converge
end
end
B = Bnouveau;
drapeau = abs(R(i-1) - R(i)) > epsilon
disp('i = '+string(i)+' ; k = '+string(k0)+' ; R = '+string(R(i)))
end
A = B;
endfunction
// **********
// Programme principal
// **********
// lecture des données
donnees = read('pic_gauss_dissym_bruite.txt',-1,2);
// carcatéristiques des données
Xdef = donnees(:,1);
Ydef = donnees(:,2);
Ainit = [-0.03, 9.7, 8*((0.84 - 0.03)/2.35)^2, 8*((0.45 + 0.03)/2.35)^2];
// Régression
tic();
[Aopt, Rnr] =...
gaussnewton(gauss_dissym, Xdef, Ydef,...
Ainit, itermax, precision)
t = toc();
// Courbe calculée
Yopt = gauss_dissym(Aopt, Xdef);
// Affichage
print(%io(2),Ainit)
print(%io(2),Aopt)
print(%io(2),t)
clf
subplot(2,1,1)
plot(Xdef, Ydef, "-b")
plot(Xdef, Yopt, "-r")
subplot(2,1,2)
plot(Rnr)
Il est possible d'utiliser la commande pinv
pour pseudo-inverser la matrice jacobienne (Scilab effectue une décomposition en valeurs singulières). Le code source est légèrement plus court, la performance peut varier selon la structure des données ; par contre, il est un peu plus boîte noire. Les lignes
J = linearisation_approchee(f, B, X, epsilon); // matrice jacobienne
tJ = J'; // transposée
deltap0 = inv((tJ*J))*tJ*deltay;
doivent être remplacée par
J = linearisation_approchee(f, B, X, epsilon); // matrice jacobienne
deltap0 = pinv(J)*deltay;
Il est également possible d'utiliser la fonction Scilab leastsq
. On a alors un code plus compact, mais plus « boîte noire » et l'on ne peut pas afficher la progression du facteur de fiabilité R. Par ailleurs, l'exécution est plus longue (sur mon système : 141 ms contre 31 ms, soit 4,5 fois plus lent).
// **********
// Constantes et initialisation
// **********
clear;
clf;
chdir('monchemin/')
// **********
// Fonctions
// **********
exec('fonctions_communes.sce', -1)
function [e] = res(A, X, Yexp)
Ycal = gauss_dissym(A, X);
e = sqrt(sum((Yexp-Ycal).^2));
endfunction
// **********
// Programme principal
// **********
// lecture des données
donnees = read('pic_gauss_dissym_bruite.txt',-1,2);
// carcatéristiques des données
Xdef = donnees(:,1);
Ydef = donnees(:,2);
Ainit = [-0.03, 9.7, 8*((0.84 - 0.03)/2.35)^2, 8*((0.45 + 0.03)/2.35)^2];
// Régression
tic();
[Rnr, Aopt] =...
leastsq(list(res, Xdef, Ydef), Ainit);
t = toc();
// Courbe calculée
Yopt = gauss_dissym(Aopt, Xdef);
// Affichage
print(%io(2),Ainit)
print(%io(2),Aopt)
print(%io(2),t)
clf
plot(Xdef, Ydef, "-b")
plot(Xdef, Yopt, "-r")
Conditions d’utilisation
Vous avez la permission de copier, distribuer et modifier ce document selon les termes de la GNU Free Documentation License version 1.2 ou toute version ultérieure publiée par la Free Software Foundation, sans sections inaltérables, sans texte de première page de couverture et sans texte de dernière page de couverture. Un exemplaire de la licence est inclus dans la section intitulée GNU Free Documentation License.http://www.gnu.org/copyleft/fdl.htmlGFDLGNU Free Documentation Licensetruetrue |
- Vous êtes libre :
- de partager – de copier, distribuer et transmettre cette œuvre
- d’adapter – de modifier cette œuvre
- Sous les conditions suivantes :
- paternité – Vous devez donner les informations appropriées concernant l'auteur, fournir un lien vers la licence et indiquer si des modifications ont été faites. Vous pouvez faire cela par tout moyen raisonnable, mais en aucune façon suggérant que l’auteur vous soutient ou approuve l’utilisation que vous en faites.
- partage à l’identique – Si vous modifiez, transformez, ou vous basez sur cette œuvre, vous devez distribuer votre contribution sous la même licence ou une licence compatible avec celle de l’original.
Éléments décrits dans ce fichier
dépeint
Valeur sans élément de Wikidata
20 novembre 2012
Historique du fichier
Cliquer sur une date et heure pour voir le fichier tel qu'il était à ce moment-là.
Date et heure | Vignette | Dimensions | Utilisateur | Commentaire | |
---|---|---|---|---|---|
actuel | 20 novembre 2012 à 12:50 | 478 × 364 (23 kio) | Cdang | {{Information |Description ={{en|1=Profile fitting of an asymmetrical noisy gaussian peak, by Newton-Raphson regression. Created with Scilab, processed with Inkscape.}} {{fr|1=Ajustement de profil d'un pis gaussien dissymétrique bruité, par régre... |
Utilisation du fichier
La page suivante utilise ce fichier :
Usage global du fichier
Les autres wikis suivants utilisent ce fichier :
- Utilisation sur en.wikipedia.org
Métadonnées
Ce fichier contient des informations supplémentaires, probablement ajoutées par l'appareil photo numérique ou le numériseur utilisé pour le créer.
Si le fichier a été modifié depuis son état original, certains détails peuvent ne pas refléter entièrement l'image modifiée.
Titre court | Regression sur un pic gaussien dissymétrique bruité |
---|---|
Titre de l’image | Creator: GL2PS 1.3.2, (C) 1999-2006 Christophe Geuzaine (geuz@geuz.org)
For: Scilab CreationDate: Tue Nov 20 11:41:31 2012 |
Largeur | 478.01855 |
Hauteur | 364.31445 |