Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 09-02-2007 13:40:34

Giansolo
Invité

Fittage de courbes par des fonctions exponentielles... [Résolu]

Bonjour à toutes et à tous,

Tout d'abord, je tiens à vous prevenir, je ne suis pas statisticien, ni mathématicien, donc je vais peut être dire certaines choses qui vont vous sembler triviales ou vous hérisser les cheveux sur la tête... tadaaaam!

Je cherche, dans un premier temps, à fitter un ensemble de données par une fonction exponentielle (uniquement), pour avoir l'allure générale de la courbe, et dans un second temps, à itérer cette méthode pour fitter toutes les variations de chaque série avec des exponentielles.

Donc, je récapitule : dans un premier temps :
Je dois réaliser un modèle permettant de fitter des courbes à tendance pluri-exponentielles décroissantes ou croissantes à partir de série de données.

Un exemple graphique vous sera sans doute plus parlant :
Donc, voici le résultat que j'aimerais obtenir sur une série de nombre :
Exemple.jpg

Puis dans un second temps :
Je voudrais que mon modèle puisse fitter chaque sous-série avec des fonctions exponentielles, le tout étant, si possible, automatiser (cad que les points d''inflections' devront être déterminés automatiquement si possible ou au pire, suivant certaines contraintes).
____________________________
Le fruit de mes reflexions :
Je suis donc partit sur un modèle basé sur y = a * exp(bx) en passant par la régression linéaire suivante :
ln(y) = ln(a) + bx.

autrement dit :
213767dfb147ab2c3e0ff1bcd67d1d7b.gif

Et j'obtient le résultat graphique suivant :
graphic1.JPG

Ce qui est pour le moins mauvais! j'ai sans doute du me tromper quelque part, mais ou ?
je travaille sous Octave (clone Matlab) et j'utilise le code suivant, avec :
X = dates
Y = records

 
B = cov(dates, log(records)) / var(dates);
A = exp(mean(log(records)) - B*mean(dates));

for i=1:size(records,1)
    mod_out(i) = A * exp(B * dates(i));
end;

De plus en utilisant la fonction regress() de Matlab, et en plottant les résidus, j'obtient le meme résultat!
du coup je ne trouve pas mon erreur... car erreur il doit y avoir!
Pouvez vous m'éclairer sur ce premier point ?

merci!

#2 09-02-2007 17:21:54

john
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

hello,
... un peu de mal à comprendre dans le détail (and devil hides in the details)
mais de toute évidence les A et B de ton tracé ne sont pas des constantes. Or il me semble qu'elles le devraient.
Me trompe-je ?
A+

#3 13-02-2007 10:19:41

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Tout d'abord, merci pour ta réponse,

Bon en fait j'utilisais à l'époque le modèle suivant : y = a*exp(Ax) qui était insuffisant pour modéliser mon problème...
J'utilise maintenant y = a*exp(Ax) + H qui convient tres bien, pour un H pris entre Vmin-Z ou est compris entre -1 et -3... j'aimerais déterminer ce H automatiquement, par la minimisation de la fonction, mais je me heurte à quelque chose que je ne sais pas faire ... (s'agit-il des descente de gradient? du recuit simulé?).

De plus, et il s'agit de la grosse question, j'aimerais pouvoir déterminer chacune des sous séries de manière automatique.

Voici les résultats que j'obtient à l'heure actuelle en "spécifiant" les 5 sous-séries :
graphic2-2.JPG

le modèle est bon, et le H est choisit 'manuellement' pour chaque sous série entre Min-1 et Min-3. Le problème restant :
-a ) de fixer H automatiquement.
-b ) et surtout de déterminer les sous séries de manière automatique... je ne sais pas vers quelle méthode m'orienter en fait... je ne vois pas

#4 13-02-2007 11:55:39

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Hello,
hum, hum mes réponses sont bien modestes face à ce Pb. Pour l'instant, l'oeil et le processeur qui est derrière savent faire beaucoup mieux que toute machine. Mais ton découpage en tranches verticales me semble quand-même subjectif : Exemple, les points entre 1940 et 1960 pourraient être attachés à l'expo. bleue et le résultat serait complètement différent, non ?
Au risque de faire sourire les puristes et autres spécialistes du fittage... je te propose d'ajuster des morceaux de paraboles à tes données (il me semble que c'est ce que fait l'oeil qui se sert de la courbure pour détecter les points de rupture éventuels).
y= a.exp(b.x) + h = (a + h) + a.b.x + a.b².x²/2
Partant des 3 premiers points, où l'écart quadratique est nul, on ajuste 4 puis 5... points jusqu'à ce que l'écart "change d'ordre de grandeur" (ce serait trop beau ! disons devienne inacceptable). On en déduit le point de rupture et h. Ensuite, tu appliques ta méthode d'ajustement exponentiel. Attention, non mis en oeuvre, non testé, rien... simple idée à classer dans la rubrique des bricolages de john, mais bon, il faut bien se mouiller pour cesser de sécher.
A+

Hors ligne

#5 16-02-2007 12:24:30

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Merci pour cette réponse rapide et cette indication, mais j'avoue être un peu perdu...

Quelle est la méthode à utiliser pour fixer le H ?
La formule suivante : y = (a + h) + a.b.x + a.b².x²/2 correspond à un ajustement avec des morceaux de paraboles ou à la formule permettant de trouver h apres ajustement des différents points (1+2+3 puis 1+2+3+4 puis ...)?

Merci!

#6 17-02-2007 16:39:55

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Bonjour,
Pour résumer, ton pb est de segmenter des données, puis, sur chaque segment, d'éliminer une constante h qui empèche de faire un ajustement linéaire en passant par le log. Ce que j'ai proposé est un simple ajustement parabolique qui devrait fonctionner sur un segment de données pour déterminer h (mais ne règle pas le problème de la segmentation automatique).
La formule proposée correspond au développement de l'exponentielle à l'ordre 2. Après ajustement d'un segment de données par Ax² + Bx + C elle permet de restituer h, a et b à partir de A, B et C. Validité ?
J'ai pensé aussi à une autre possibilité pour éliminer la constante h (avant ajustement) qui serait de dériver les données par y'(n+1/2) = [y(n+1) - y(n)]/[(x(n+1) - x(n)] avec l'inconvénient d'augmenter le bruit des données. Lissage à faire avant de dériver ?
----------------------------------
Rectification : suppression d'un lien traitant de la segmentation de données car inexploitable sans 10 années d'autom. derrière soi.
----------------------------------
Rerectif. J'ai testé la dérivation préalable. C'est nul ! Il y a trop de bruit et pas assez de données pour faire un lissage avant de dériver.
Une idée du net consisterait à faire glisser une double fenêtre d'ajustement des données avec un modèle à droite et un modèle à gauche du point milieu de fenêtre (supposé point de discontinuité). Si les paramètres du modèle sont "différents" à droite et à gauche, on décrète un changement dans le processus observé. (OK pour du temps réel, mais on doit pouvoir faire mieux lorsqu'on dispose de toutes les données).
A+

Dernière modification par john (18-02-2007 17:16:04)

Hors ligne

#7 19-02-2007 10:41:34

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

merci pour ces infos john, et je vois à peu pret ce que tu veux dire avec les fenetres, mais ca va me sembler extremement gourmand en temps de calculs, mais j'ai tout mon temps lol!

En fait tu suggères de faire 2 fenetres glissantes (donc comportant au minimum X points pour l'ajustement) en essayant d'ajuster dans chacune des deux fenetres les X points avec comme point de discontinuité l'intersection des fenetres. Quand les paramètres des modèles diffèrent "de trop" (à définir) on décrète qu'il y a rupture de sous série ?

C'est bien ca?

A l'heure actuelle, voici le modèle que j'ai crée et qui split correctement pour la série de données étudiée :

-Tout d'abord, je crée une droite d'observation y2 = ax+dist suffisament distante des données X,Y suivant l'axe Y. dist doit etre suffisament grand pour ne pas être en intersection avec la courbes de données (X,Y)
-Ensuite, je calcule la distance euclidienne entre les données et la droite d'observation, ce qui revient à calculer en fait : y2(x) - Y(x) puisque nous nous placons toujours sur les mêmes dates (les memes X).
Je me retrouve du coup avec l'ensemble des distances entre les points et ceux projettés sur la droite d'observation.
Il suffit de rechercher tous les minimums locaux qui correpondront à l'indice des sous-séries :
voici ce que ca donne sur les données en cours :

graphic3.JPG

On voit bien que les minimums locaux sont les points de 'liaisons' des series :
1 à 3 / 3 à 7 / etc...

je pense que cette méthode n'est pas très robuste, mais j'attends de le tester sur d'autres séries pour en etre sur.

Je rencontre également un autre problème sur d'autres séries, le A de Aexp(Bx) + H est beaucoup trop grand (incalculable : A = exp(mean(log(Y-H)) - B*mean(X)), avez vous une idée pour résoudre ce probleme ? suffit-il que je réduise les données par un facteur? (1000, 10000, ou + ?)?

#8 19-02-2007 12:58:09

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Bonjour,

Giansolo a écrit :

suffit-il que je réduise les données par un facteur? (1000, 10000, ou + ?)?

Enfin une question à ma portée... réponse : oui. De même, tu peux changer l'origine des temps, ce qui évite les nombres astronomiques lorsqu'on fait de l'ajustement parabolique où il faut calculer des sommes de x^4... (ajustement parabolique que j'ai testé et qui ne marche pas non plus car pour représenter des exponentielles décroissantes, il faut introduire une contrainte sur la dérivée qui doit rester négative).
A+ si je trouve qqchose sur le www.

Dernière modification par john (19-02-2007 13:26:54)

Hors ligne

#9 22-02-2007 17:07:16

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Effectivement merci pour l'info, c'est utile de réduire les données :-)

voilà, j'ai un modèle qui marche à peu prêt et j'aimerais faire comme tu as dis, aka : fitter N points, regarder l'erreur fitter N+1 points regarder l'erreur.

A l'heure actuelle j'ai écrit cet algorithme itératif qui marche, mais je suppose que j'évalue mal l'erreur.... en effet, ma démarche est la suivante :

pour les N+1 points j'evalue l'erreur quadratique moyenne (EQM1).
si EQM1 > seuil (manuel) alors je garde le fit sur N

Mon problème est que l'EQM n'est peut etre pas une erreur très "adaptée", elle ne tiens pas compte de la dispersion par exemple...
avez vous des idées alternatives pour le calcul de l'erreur ?

merci!

#10 22-02-2007 23:37:36

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Attention, je n'ai pas trouvé cette "méthode" dans la littérature. Il y a donc peu de chances que ça marche. Concernant l'erreur quadratique, il me semble que l'algo devrait être le suivant :
1) ajustement de n points => modèle M1(x) et EQM1 = erreur quadratique MOYENNE (erreur totale divisée par n)
2) calcul de l'écart quadratique au point suivant, soit E1 = [y(n+1) - M1(x(n+1))]²
3) comparaison des valeurs E1 et EQM1 :
= soit elles sont peu différentes et on va en 1) avec n+1 points (le modèle reste valable)
= soit la différence est "notable" et on segmente les données entre les points n et n+1.
Bon courage

Hors ligne

#11 23-02-2007 10:55:16

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Merci pour ta réponse rapide John,
je calcule bien l'EQM (erreur quadratique moyenne) comme tu dis, pas de soucis.
J'ai également pensé à comparer l'EQM précédent et la nouvelle EQM (n+1) comme tu le proposes, mais j'ai peur que cette méthode va dépendre du nombre de points (plus il est grand moins le n+1ieme point va influer sur la courbe fitté et ca va etre presque la meme que celle pour les n points). De plus c'est une erreur moyenne, qui ne prend pas en compte la dispersion....

Je suis ouvert à tout autre proposition!!!

merci de votre aide!

#12 23-02-2007 22:38:22

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Giansolo a écrit :

J'ai également pensé à comparer l'EQM précédent et la nouvelle EQM (n+1) comme tu le proposes...

Merci de relire mon dernier post. Je te propose de comparer E1 et EQM1. Rien  à voir avec EQM(n+1) qui, comme tu le dis va se moyenner avec le nombre de points.
A+

Hors ligne

#13 26-02-2007 14:46:40

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

ah oui, exact! désolé j'avais mal lu dans la précipitation à lire ta réponse!
J'ai essayé et ca marche plutôt pas mal!

merci pour ta réponse!

#14 26-02-2007 20:01:08

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Bonne nouvelle alors...
De mon côté, pour m'amuser et ne pas perdre la main, j'ai testé hier l'ajustement parabolique avec contraintes (Kuhn Tucker) et ça marche fort bien également (du moins avec le jeu de données que tu as transmises).
Et si tu n'es pas accroché mordicus à un modèle exponentiel, c'est ce que je te conseille de faire.
L'automatisation serait complète, avec élimination du pb. de h. L'algo. n'est guère plus compliqué mais il y a un peu de programmation.
En revanche, si tu souhaites repasser au modèle exponentiel, ce n'est pas immédiat, ce qui m'étonne un peu. En tout cas, je n'ai pas encore trouvé la clé.
A+

Dernière modification par john (26-02-2007 20:58:59)

Hors ligne

#15 28-02-2007 11:40:56

Giansolo
Invité

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

désolé pour ce temps de réponse un peu tardif, mais j'ai eut une coupure internet!

Merci pour ces dernières informations, je ne suis pas attaché "mordicus" au fittage par exponentielles, et ton ajustement parabolique avec contraintes me semble interessant... je vais regarder sur Internet si je trouve des infos concernant ca...

S'il y a un peu de prog à faire, ce n'est pas trop grave, je bosse sous Octave (clone Matlab) et ca devrait pouvoir le faire.

#16 28-02-2007 11:47:31

Giansolo
Membre
Inscription : 28-02-2007
Messages : 5

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Hop voilà je me suis inscrit car j'en avait marre de pas pouvoir éditer mes messages...
Donc oui le modèle que je testais marche plutot pas mal, mais il y a un certain nombres de jeux de données ou le modèle se casse complètement la figure... je posterais les résultats ici dès que j'lai aurais.

existe-til un moyen pour chaque sous-fittage d'estimer l'erreur de fittage ?
j'ai vu sur des logiciels de stats qu'il y avait des estimateur d'erreurs appellés R et p, et j'ai regardé sur Internet sans succès...

merci encore!

Hors ligne

#17 28-02-2007 13:10:27

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Bienvenue à bord,
Pour la méthode Kuhn Tucker, effectivement j'aurais pu te donner le lien que voici ainsi que l'adaptation bête et méchante que j'ai testée.

Ajustement parabolique avec contraintes
==========================
Voir : http://fr.wikipedia.org/wiki/Conditions_de_Kuhn-Tucker

Donnée de n points de RxR
-------------------------------
(xi, yi) i = 1..n

Modèle d'ajustement
------------------------
y = a.x² + b.x + c

Fonction objectif (somme des écarts quadratiques)
-------------------
Q(a,b,c) = -Somme(1..n) [yi - a.xi² - b.xi - c]² (attention : signe - en tête)
à maximiser sur R^3 avec contraintes sur a et b.

Contraintes (inégalités au sens large)
-------------
Concavité de la parabole tournée vers le haut (a > 0)
Pente négative en xn (-2.a.xn - b > 0) (variante possible avec x(n+1) également)
sinon, la parabole a tendance à remonter (pas terrible pour représenter une expo. décroissante)

Lagrangien
-------------
L = Q(a,b,c) + a.u - (2.a.xn + b).v
u, v multiplicateurs dans R+

Conditions nécessaires (grad L = 0)
--------------------------
DQ/a = dérivée partielle de Q par rapport à a.
DQ/a + u - 2.xn.v = 0
DQ/b - v = 0
DQ/c = 0

Conditions supplémentaires
--------------------------------
min(u, a) = 0
min(v, -2.a.xn - b) = 0
C'est là qu'il y a un peu de programmation et tests à faire, me semble-t-il. Avec Maple, c'est une seule ligne d'instructions...

A+ si besoin.

Dernière modification par john (28-02-2007 13:14:44)

Hors ligne

#18 28-02-2007 17:44:59

Giansolo
Membre
Inscription : 28-02-2007
Messages : 5

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Merci pour ces informations,
ca m'a l'air trèèèèèèèèèèèèèèèès (trop) compliqué pour moi..

Les monoexponentielles sont majoritairement décroissantes, mais il peut arriver que certaines pentes "remontent" un peu (mais "pas trop"). Je dis ca au vu de la section "contraintes".

si je devais programmer l'ensemble (ce que j'aimerais bien faire, mais il y a un degré de compléxité assez élevé), je me poserais les questions suivantes :

------------------------
y = a.x² + b.x + c
j'imagine qu'il faut calculer les coefficients du modèle (aka a,b,c) comment faire ?


Fonction objectif (somme des écarts quadratiques)
-------------------
Q(a,b,c) = -Somme(1..n) [yi - a.xi² - b.xi - c]² (attention : signe - en tête)
à maximiser sur R^3 avec contraintes sur a et b.
Comment maximise-t-on ? (question con sans doute!)

Contraintes (inégalités au sens large)
-------------
Concavité de la parabole tournée vers le haut (a > 0)
Pente négative en xn (-2.a.xn - b > 0) (variante possible avec x(n+1) également)
sinon, la parabole a tendance à remonter (pas terrible pour représenter une expo. décroissante)

oula... à partir de laGrangien c'est du mandarin!

Hors ligne

#19 28-02-2007 21:52:55

john
Membre actif
Inscription : 10-02-2007
Messages : 543

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Bonsoir Giansolo,
J'ai un peu de mal à situer ton niveau mais il me semble que tu exagères la difficulté. Ici, c'est de la pure technique mathématique qu'on applique "bêtement" en suivant le wiki. Niveau requis : seconde-première (savoir dériver un polynôme du second degré).
Je comprends tes questions mais pour l'instant je n'ai fait que positionner ton problème sur le canevas donné par le wiki. Le but c'est effectivement de calculer a, b et c qu'on obtient en maximisant une certaine fonction appelée Lagrangien. Je te propose de faire étape par étape en commençant par écrire ce Lagrangien :
L(a,b,c,u,v) = Q(a,b,c) + a.u - (2.a.xn + b).v
u et v sont les multiplicateurs de Lagrange, paramètres indépendants de a et b pour le moment.
Ensuite, tu vas dériver L par rapport à a et écrire une première égalité :
dL/da = 0
de même pour b et c.
Je te laisse faire, en te rappelant que la dérivée d'une somme est égale à la somme des dérivées (au cas où...).
C'est la plus grosse partie du travail.
A+

Dernière modification par john (28-02-2007 21:55:02)

Hors ligne

#20 19-01-2009 09:53:11

JJ
Membre
Inscription : 04-06-2007
Messages : 110

Re : Fittage de courbes par des fonctions exponentielles... [Résolu]

Bonjour,

réponse tardive : on trouve un algorithme simple de régression pour les fonctions y=a+b.exp(c.x) ou y=a+b.(x^c) , etc. dans un document "REGRESSIONS y=a+b.x^c et WEIBULL", à l'adresse suivante :
http://les-mathematiques.u-strasbg.fr/p … msg-490239

Dernière modification par JJ (20-01-2009 07:55:26)

Hors ligne

Pied de page des forums