Fittage de courbe par des fcts exponentielles

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

Fittage de courbe par des fcts exponentielles

par Giansolo » 02 Fév 2007, 16:07

Bonjour à tous,

Je suis nouveau sur ce forum, qui à l'air pas mal du tout (d'ailleurs c'est ce qui m'a poussé à m'inscrire) et je me pose une question sur le fittage de mes courbes.
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...
:stupid_in

Donc mon problème, est (de mon point de vue) assez complexe :
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 :
Image

Je voudrais que mon modèle puisse fitter chaque série de cette sorte, 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).

Tout d'abord, pensez vous que cela soit réalisable, et ensuite que me conseillez vous de faire ? (méthodes?)
Petite précision, je travaille sous Octave (clone Matlab), ou, au pire, sous Excel.

Merci à toutes les ames qui peuvent m'aider!
Gian



fahr451
Membre Transcendant
Messages: 5142
Enregistré le: 06 Déc 2006, 00:50

par fahr451 » 02 Fév 2007, 16:12

celui capable de le faire c'est dieu le fitte.

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 02 Fév 2007, 16:14

Lol!!
merci pour ta réponse rapide!

Je me doutais bien que la réponse serait (malheureusement) de cet ordre la...

Edit : et en étudiant le changement de signe de la dérivée de chaque sous série (à supposer qu'on puisse les trouver) ?

andros06
Membre Relatif
Messages: 180
Enregistré le: 30 Aoû 2006, 14:30

par andros06 » 02 Fév 2007, 16:20

Hello ;-)

Tu veux que chaque série puisse s' "exprimer" en fonction d'une exponentielle, c'est ça ?

Si oui, il te suffit de faire une régression linéaire . Si tu veux plus de détails, demande.

Dominique Lefebvre
Membre Légendaire
Messages: 8005
Enregistré le: 03 Déc 2005, 13:00

par Dominique Lefebvre » 02 Fév 2007, 16:27

andros06 a écrit:Hello ;-)
Si oui, il te suffit de faire une régression linéaire .


Exponentielle, en l'occurence....

andros06
Membre Relatif
Messages: 180
Enregistré le: 30 Aoû 2006, 14:30

par andros06 » 02 Fév 2007, 16:38

Quand je dis régression linéaire, ça suppose qu'on est passé aux log d'abord.

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 02 Fév 2007, 16:50

Euh oui... probablement, la régréssion linéaire ? exponentielle ? la régréssion expnentielle ? ca à l'air très chouette tout ca! ca m'aiderais également à trouver automatiquement les points d'inflections (ca s'appelle comme ca?) dans chacune des séries et de fitter le tout ?

En fait, je ne peux pas fitter les series à l'aide de polynomes d'ordres élevés, car le but de mes recherches est de démontrer que chaque 'sous-série' (je ne sais pas si je m'exprime bien la) de série est 'fittable' par des fonctions monoexponentielles décroissantes ou croissantes (comme le montre le dessin)...

euh... c'est clair ou pas ce que je dis ? n'hesitez pas a me le dire!

Ps : en tout cas, voilà un forum super actif, ca fait plaisir!

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 02 Fév 2007, 17:36

andros06 a écrit:Quand je dis régression linéaire, ça suppose qu'on est passé aux log d'abord.


Salut,

je pense pas qu'il ait vu de quoi tu parles...

Giansolo, la methode c'est comme le dit Andros une regression lineaire.
La regression lineaire ne "s'attaque" pas seulement a des problemes a premiere vue lineaire.

Beaucoup de probleme se ramene a une regression lineaire.
Ici par exemple comme le dit Andros apres le passage par le log ont est ramené a un probleme de regression lineaire.
La seule difference c'est qu'ici les erreurs sont multiplicatives...

on cherche g(x)=aexp(vx) avec a et v inconnu.

on peut chercher le log:
ln(g(x))=ln(a)+vx qui implique un probleme lineaire d'inconnu le vecteur (ln(a);v).

il faut alors minimiser en norme l'ecart b-AX

b c'est un vecteur colonne ou tu as mis tes données ln(g(xi)) , A c'est la matrice a deux colonnes la premiere colonne ce ne sont que des 1, la deuxieme ce sont les xi et X=(lna;v) est le vecteur solution dont tu cherches les coordonnées minimisante a travers ce systeme de minimisation(qu'on appel probleme aux moindres carrés).

La solution X est alors: X=(A^(T)A)^(-1)A^(T)b
Je dois y aller la, si Andros a le temps il pourra je pense te donner plus de details si tu vois pas (mais la tu as tout ce qu'il faut), si non si tu patientes jusqu'a ce soir , je t'expliiterai les solutions.

andros06
Membre Relatif
Messages: 180
Enregistré le: 30 Aoû 2006, 14:30

par andros06 » 02 Fév 2007, 17:57

Bon je reprends l'explication de BQss :
tu dispose de "mesures" Y[i] en fonction de X[i] :

tu pressens que tu peux exprimer Y en fonction de X sous la forma A.exp(B.X)

en passant aux log : log(y)=log(A)+B.X . Le but du jeu c'est de trouver A et B qui satisfont le mieux à tes mesures. J'appelle Y2=log(Y) et A2=log(A)

1) Calcule les moyennes empiriques des tableaux X et Y2 (qu'on appellera Xm et Ym)
2) Idem avec les variances empiriques de X et Y2 (S²x et S²y)
3) Tu calcules la covariance de (X,Y2) ----> cov(X,Y2)

Tu mec roiras sur paroles qd je te dis que B=cov/S²x et A2=Ym-B.Xm
Et ce avec une "erreur" de 1-|cov/racine(Sx*Sy)|

Si t'as plus de questions sur le pourquoi du "tu me croiras sur parole" fais le-moi savoir.

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 05 Fév 2007, 10:40

hop me voilà de retour,

eh bien!
Je vais regarder ca en détail, et je vous tiens au courant, mais j'aurais sans doute des questions, car tout cela n'est pas 'limpide' pour moi.


En tout cas, merci d'avoir pris le temps de répondre, ca fait plaisir!

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 06 Fév 2007, 16:07

Bonjour tout le monde,

En relisant le truc je me dis que je me suis peut etre mal exprimé : en fait dans l'exemple qui n'était pas très clair que je vous ait mis en haut, on constate que pour chaque série (1,2,3 ou 4) on fit 'plus' que la tendance "générale" de la courbe, mais les sous-tendance (si ca veut dire quelque chose).

C'est précisemment ce que je souhaiterais réaliser : fitter toutes les tendances de chaque série : par exemple pour la série 3 (points jaunes), il y a trois sous séries... je suppose que dans la continuité de ce dont vous m'avez parlé (régréssion linéaire) on pourrait écrire, si je ne me trompe pas, que :

y(série3) = k*(a + b * exp(x-x0))

Est-ce que cela à un sens ?
Ca reviendrais à décomposer chaque série en somme de sous séries ?

Comment déterminer 'k' ? comment 'splitter' les séries en sous séries ?
Peut-on projeter les données dans un autre domaine statistique pour en faire des clusters ??

J'imagine qu'il faut introduire des contraintes pour ne pas se retrouver avec un fit par point!

je vous remercies d'avance pour vos réflexions qui pourront certainement m'être utile!!!

Gian

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 06 Fév 2007, 18:40

Salut,

quel est le probleme, il suffit de realiser ce qu'on t'a proposé, mais pour chaque parcelle de courbe.
Ensuite les point d'inflexion sont les x qui correspondent au point d'intersections entre les courbes representant tes sous series.

Pour chaque sous series, tu reunies les points considérés et tu en deduis la regression.

PS: "exp(x-x0)" --> tu n'as pas besoin du x0, il se retrouve dans la constante A.
A'exp(B(x-x0))= A'exp(Bx-Bx0)=A'/exp(Bx0) * exp(vx)= A exp(Bx).
Le role de A est justement de s'occuper d'eventuel translation par rapport a la courbe exp(Bx), multiplier e^(x) par A c'est la translater de -ln(A).
Tu cherches donc pour chaque parcelle de courbe une fonction du type g(x)=Aexp(Bx). Andros t'as explicité les resultats, tu n'as plus qu'a remplacer.
Apres si tu ne vois pas comment utiliser ces informations dis le nous( tu vois comment calculer une covariance empirique ou une moyenne emprique?).



avec et les moyennes empirique de x et log(y)

soit






voir ici pour les formules de covariances etc...
formule

Au final ta solution pour la sous série etudiée vaut:


Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 08 Fév 2007, 10:39

Merci pour ces informations, c'est très clair (enfin je le pense, je vais commencer la modélisation aujourd'hui) mais ma question était plutôt :

Comment, à partir d'une série, déterminer de manière 'automatique' (ou suivant certaines contraintes) les sous séries ? (fittables par la regression linéaire que vous avez établi)

par exemple, comment savoir que la série 3 comporte 3 sous séries de manière 'automatique' (ou pseudo auto) et quelles contraintes établir ?

Do you see what i mean doctor ?

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 08 Fév 2007, 13:29

Ca y ait j'ai établit le model, et ca marche bien!
Merci!

Par contre le rendu est pas tres 'smooth' (nombre de points insuffisant)... Peux ton interpoler les points (c'est déjà ce qu'on fait!) pour que le rendu soit plus smooth ?

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 08 Fév 2007, 16:29

Bon finalement, ca fit pas des masses, j'en conclut que je me suis probablement trompé dans l'implémentation de l'algorithme...

déjà je vous montre le résultat qui n'est pas tip top :
Image

et ensuite le code associé, basé sur l'équation décrite par BQss, avec :
X = dates
Y = records

Code: Tout sélectionner
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;


Je ne trouve pas l'erreur, mais je ne désespere pas!
J'essaye dans un premier temps de fitter la courbe avec votre aide, avant de me pencher plus en avant dans les explications qui risquent d'être ... longues!

PS : D'ailleurs a ce propos je cherche un livre style 'les stats pour les nuls' qui expliquent les bases de la régression linéaire, qui donne des exemples clairs sur des notions comme la variance, la covariance, voire des notions plus complexes ... n'hésitez pas à me conseiller!

andros06
Membre Relatif
Messages: 180
Enregistré le: 30 Aoû 2006, 14:30

par andros06 » 08 Fév 2007, 16:43

L'algorithme de base est le suivant : ---> a+=k signifie a=a+k

//Déclarations locales
Ybarre est un numérique (20,10) // Moyenne de la série des Y
Xbarre est un numérique (20,10) // Moyenne de la série des X
sum est un numérique (20,10) // Pour calculer les sommes
cov est un numérique (20,10) // Covariance des series X et Y
sigma est un numérique (20,10)// variance de la serie X
sigma2 est un numérique (20,10)// variance de la serie y
temp1,temp2 sont des numériques (20,10) // Variables de calcul
i est un entier // Entier boucle

//Initialisation(s)
sum=0.0

//Moyennes des mesures Y
POUR i=1 A N
sum=sum+Y[i]
FIN
Ybarre=sum/N

sum=0.0

//Moyennes des X
POUR i=1 A N
sum=sum+X[i]
FIN
Xbarre=sum/N //OK

sum=0.0

//Calcul de la covariance de X et Y
POUR i=1 A N
temp1=(X[i]-Xbarre)*(Y[i]-Ybarre)
sum+=temp1
FIN
cov=sum/N

sum=0.0

//Calcul de la variance de X
POUR i=1 A N
sum+=X[i]*X[i]-2.0*X[i]*Xbarre+Xbarre*Xbarre //puissance(x[i]-xbarre,2)
FIN
sigma=sum/N


sum=0.0

//Calcul de la variance des Y
POUR i=1 A N
sum+=Y[i]*Y[i]-2.0*Y[i]*Ybarre+Ybarre*Ybarre
FIN
sigma2=sum/N

//Y~alpha*X+K
alpha=cov/sigma
K=Ybarre-alpha*Xbarre

andros06
Membre Relatif
Messages: 180
Enregistré le: 30 Aoû 2006, 14:30

par andros06 » 08 Fév 2007, 16:51

De plus, vu que tu utilises certainement Matlab, il me sempble qu'il y a une procédure de regression déjà existante. A voir...

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 08 Fév 2007, 18:16

sympa!

Alors la je vais faire des suppositions :
Je suppose que tu me donnes l'algo de base de la régression linéaire la (tu as voulus écrire y = alpha*X + K en bas ?)

Ou faire intervenir les exponentielles ? le lien avec les exponentielles est : log(y)=log(A)+B.X ou alpha = B et K = log(A) ?

Je me retrouve donc avec le K et le B fixé et je peux calculer les nouveaux Y avec la formule... sauf erreur de ma part c'est ce que j'ai réalisé en utilisant la formule suivante :
Image

et en calculant les paramètres associés à cette équation.

j'utilise les formules de Octave effectivement (clone matlab), et je suppose qu'il calcule correctement les variances, covariances et compagnie, j'ai toutefois noté un truc étrange puisqu'avec (je reprends ton code) :
Code: Tout sélectionner
sum=0.0;
%Calcul de la variance de X
for i=1:size(dates,1)
   %puissance(x[i]-xbarre,2)
   sum+=dates(i)*dates(i)-2.0*dates(i)*Xbarre+Xbarre*Xbarre;
end;
sigma=sum/size(dates,1);
sigma_ = var(dates);


je me retrouve avec :
sigma = 9.2019*10^5
et sigma_ = 1280.3

sachant que mon champs dates est compris entre [1901:2006]! et que Xbarre est correctement calculé... plutot étonnant donc!

andros06
Membre Relatif
Messages: 180
Enregistré le: 30 Aoû 2006, 14:30

par andros06 » 09 Fév 2007, 10:02

Ben c'est juste le développement de 1/N*somme{(Xi-Xbarre)^2} . J'ai développé le carré car le compilateur que j'utilisais n'aimait pas trop la fonction puissance que je lui passais

est-ce que le += existe en octave ? sinon ecris sum=sum + ...

Giansolo
Membre Naturel
Messages: 44
Enregistré le: 02 Fév 2007, 15:38

par Giansolo » 09 Fév 2007, 10:25

Oui le += existe en octave, y a pas de soucis...
plutôt bizarre tout ca...! je vais essayer avec le ^ voir ce que ca donne.

Sinon concernant la regression expo, ou est mon problème avec la formule cité par BQss ?

A et B sont-ils bien calculés ? je ne vois pas d'erreur ?
B = cov(X, log(Y)) / V(X)
et
A = exp(mean(log(Y)) - B * mean(X)) ?

zut alors! :hum: :happy2:

Edit : je viens d'utiliser la fonction regress() d'octave, et lorsque je plot les résidus, j'obtient exactement la même courbe (à un facteur multiplicatif pret) que celle que j'ai affichée quelques posts plus haut et obtenue avec la formule de BQss. Ca veut donc dire que c'est bon ? parce que ca fit pas des masses lol! mais j'imagine qu'on pourra jamais avoir un résultat parfait, même si c'est loin de ce que j'esperais.

Edit :
Je viens d'implémenter la seconde version, et le résultat est toujours identique! ce qui m'ammène à dire que la regression linéaire ne fonctionne pas dans ce cas de figure ?
Voyez vous une autre méthode à utiliser ?

ho, j'oubliais, le code :
Code: Tout sélectionner
%data only :
records = data_records(:,2);
dates = data_records(:,1);

B = log(records);
A = [ones(1,size(dates,1))' dates];

X=(A'*A)^(-1) * A' * B;

AA = exp(X(1));
BB = X(2);

for i=1:size(dates,1)
   mod_out(i)= AA * exp(BB * dates(i));
end;

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 30 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite