IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Comparaison de courbes


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut Comparaison de courbes
    Bonjour à tous,

    Voilà, j'ai un problème tout simple, comparé deux courbes de puissance en fonction d'un pas d'espace variable (un véhicule avançant).

    Le problème, c'est que je n'arrive pas à utiliser un écart absolue ou relatif entre deux points des courbes se situant au même temps, puisque dans 99% des cas où mon véhicule se trouve en phase différente (freinage ou lieu d'acceleration). Du coup j'ai des écart gigantesque (même moyenné), alors qu'en réalité mes deux courbes sont similaires sur la majeure partie.

    Quelqu'un connaîtrait-il un moyen simple et efficace de comparer deux courbes sans tenir compte de l'écart entre les deux?

    Merci bocoup, et désolé si ce que je demande ne parait pas clair...

    @+.

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Tu peux montrer un exemple de courbes s'il te plait?

  3. #3
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 816
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 816
    Points : 7 648
    Points
    7 648
    Par défaut
    Salut,

    Citation Envoyé par PadawanDuDelphi
    Quelqu'un connaîtrait-il un moyen simple et efficace de comparer deux courbes sans tenir compte de l'écart entre les deux?
    Tu veux comparer deux courbes sans tenir compte de l'écart entre les deux courbes? Elle est bizarre ta phrase là...

    Sinon, essaye en interpolant tes valeurs.
    Courbe1, tu as les valeurs à t1_1 et t1_2.
    Courbe2, tu as les valeurs à t2_1 et t2_2.
    On suppose que t2_1<t1_1<t2_2. Tu calcules la valeur de la courbe 2 à t1_1 en interpolant entre les valeurs t2_1 et t2_2 (interpolation linéaire ou un truc plus subtil en fonction de l'allure de tes courbes).
    Ensuite tu peux comparer la valeur de la courbe1 à t1_1, et la valeur interpolée de la courbe2 à t1_1. Ca devrait coller mieux.

    Parce que sinon, je ne vois pas trop ce que tu as comparé jusqu'à maintenant...

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Si je comprends bien, il faut recaler "l'origine" des 2 courbes en x ou en y sur le même point.

    La méthode simple (un peu bourrine, mais pas de problème de performance à envisager) consiste à faire varier pas à pas "l'origine" en x ou y de la deuxiéme courbe afin de minimiser l'écart absolu (surface comprise entre les 2 courbes).

    Si il faut caler en x et en y, on fera une double boucle sur x et y

  5. #5
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Tout d'abord merci pour toute vos réponse,

    Pièce jointe 8499 (écart entre la bleue foncée et la rose.)

    En fait mon problème c'est qu'il existe deux paramètres principaux jouant sur les courbes. J'ai tracé les l'écart absolue entre mes courbes, et je me suis retrouvé avec des "raies" (normal avec le décalage des courbes). Un des paramètres influent sur la hauteur des courbes, et l'autre influe sur le décalage et donc sur la largeur des raie.

    J'ai mit en oeuvre en partie la méthode de Graffito, et ainsi à chaque "décrochage" des deux courbes, je calcul le temps qu'il s'écoule avant qu'il y est "recollage."

    Mais quel sera le bon critère générale?

    * Dire que les deux courbes sont identiquent à 95% du temps totale ?
    * La vitesse de réaction et la valeur limite(un peu comme une étude d'un sysrème asservi en automatique) ?
    * L'aire de l'écart absolue?

    Merci encore pour tout.

    @+.

  6. #6
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Normalise tes 2 courbes C1 et C2 pour que Max(C1)=Max(C2)=1. Quid de

    sqrt( somme((C1(x)-C2(x))^2)

    ?

    Ou sinon, les aires associées me semblent pas mal.

    Dans tous les cas, tu dois choisir à partir de quelle valeur les 2 courbes se ressemblent...

  7. #7
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    ok,

    Merci beaucoup pour votre aide. La normalisation est une excellente idée, je vais tenter ta formule et le calcul des aires et voir ce que ça donne.

    Encore merci,

    @+.

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pour comparer deux courbe et déterminer si elles sont dissemblantes, tu peux utiliser un dérivé de l'algorithme de Levenshtein qui s'appelle le DTW (Dynamic Time Warping), pour toutes les explications et des algos en veux tu en voilà, tu peux jeter un oeil sur les sources du défi Delphi (sources du défieur et des concurrents) n°2 (reconnaissance gestuelle).

    Tu devrais trouver ton bonheur sur wikipedia aussi

  9. #9
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci Waskol,

    la technique del'algorithme de Levenshtein parait vraiment adapté à mon problème, maême si ça me donne aussi l'impréssion de vouloir tuer une mouche au bazooka...

    Je vais faire des tests...Merci encore à tous,

    @+.

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    Merci Waskol,

    la technique del'algorithme de Levenshtein parait vraiment adapté à mon problème, maême si ça me donne aussi l'impréssion de vouloir tuer une mouche au bazooka...

    Je vais faire des tests...Merci encore à tous,

    @+.
    Mais c'est exactement ça : tuer une mouche au bazooka
    Efficace hein...

    PS : code, exemple et explication (+ ou -) dans le message suivant

  11. #11
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pour info, voici le code qui permet de comparer deux courbes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function Distance(Courbe1,Courbe2:array of TPoint;i,j:integer):Extended;
    var P1,P2:TPoint;
        c:Extended;
    begin
      P1:=Courbe1[i-1];
      P2:=Courbe2[j-1];
      //distance entre le point n°1 et le point n°2
      c:=sqrt((P1.X-P2.X)*(P1.X-P2.X)+(P1.Y-P2.Y)*(P1.Y-P2.Y));
      result:=c;
    end;
     
    function Minimum(a,b,c:real):real;
    var Mini:real;
    begin
      mini:=100000;
      if a<mini then mini:=a;
      if b<mini then mini:=b;
      if c<mini then mini:=c;
      result:=mini;
    end;
     
    function DistanceDTW(Courbe1,Courbe2:array of TPoint):real;
    var d:array of array of real;
        DTW:array of array of real;
        i,j,n,m:integer;
        cout:real;
    begin
      n:=High(Courbe1)+1;
      m:=High(Courbe2)+1;
      SetLength(d,n+1,m+1);
      for i:=1 to n do
        for j:=1 to m do
          d[i,j]:=Distance(Courbe1,Courbe2,i,j);
      SetLength(DTW,n+1,m+1);
      for i:=1 to m do DTW[0,i]:=100000;
      for i:=1 to n do DTW[i,0]:=100000;
      DTW[0,0]:=0;
      for i:=1 to n do
        for j:=1 to m do
        begin
           cout:=d[i,j];
           DTW[i,j]:=Minimum(DTW[i-1,j]+cout,DTW[i,j-1]+cout,DTW[i-1,j-1]+2*cout);
        end;
      result:=DTW[n,m];
    end;
    On utilise cette fonction pour comparer deux listes de points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distance:=DistanceDTW(Courbe1,Courbe2);

    Imaginons que l'on veuille déterminer si une courbe (qui correspond à un relevé effectué dans une situation réelle) se rapproche plus d'une courbeA ou plus de la courbeB (donc A et B sont deux courbes de référence, stockées ensemble et formant donc un dictionnaire)

    On compare successivement notre relevé à nos deux courbes de référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d1:=DistanceDTW(CourbeRelevé,CourbeA);
    d2:=DistanceDTW(CourbeRelevé,CourbeB);
    la valeur la plus petite d'entre d1 et d2 nous indiquera qu'elle est la courbe la plus proche.

    Avant de comparer les courbes entre elles, il ne faut pas oublier de normaliser les courbes afin qu'elles tiennent dans un même rectangle (en gros on effectue un changement de repère pour que les valeurs min et max en X et/ou en Y coincident)

    Exemple de normalisation pour que deux courbes tiennent dans un carré de 1000*1000 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    procedure Normaliser(var Courbe:array of TPoint);
    var i:integer;
        Xmini,Xmaxi,Ymini,Ymaxi,LargeurTotale,HauteurTotale:integer;
        APoint:TPoint;
       Count:integer;
    begin
      Count:=Length(Courbe);
      if Count<=0 then exit;
      Xmaxi:=-10000;
      Xmini:=10000;
      Ymaxi:=-10000;
      Ymini:=10000;
      for i:=0 to Count-1 do
      begin
        APoint:=Courbe[i];
        if APoint.X<Xmini then Xmini:=APoint.X;
        if APoint.X>Xmaxi then Xmaxi:=APoint.X;
        if APoint.Y<Ymini then Ymini:=APoint.Y;
        if APoint.Y>Ymaxi then Ymaxi:=APoint.Y;
      end;
      LargeurTotale:=XMaxi-Xmini;
      HauteurTotale:=YMaxi-YMini;
     
      for i:=0 to Count-1 do
      begin
        APoint:=point(0,0);
        if LargeurTrace>0 then
           APoint.X:=(Courbe[i].X-Xmini)*1000 div LargeurTotale;
        if HauteurTrace>0 then
           APoint.Y:=(Courbe[i].Y-Ymini)*1000 div HauteurTotale;
        Items[i]:=APoint;
      end;
    end;
    bon dev

  12. #12
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci beaucoup pour ton aide...

    Du coup la mouche n'a plus qu'à se tenir tranquille.
    Je vais implémenter le code de ce pas.
    Merci encore.

    @+.

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    Merci beaucoup pour ton aide...

    Du coup la mouche n'a plus qu'à se tenir tranquille.
    Je vais implémenter le code de ce pas.
    Merci encore.

    @+.
    Je ne les aime pas ces petites bêtes, il y en avait vraiment trop cet été

  14. #14
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Merci au code de waskhol, c'est bien l'idée de mon post précédent.

    Mais attention, la distance quadratique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:=sqrt((P1.X-P2.X)*(P1.X-P2.X)+(P1.Y-P2.Y)*(P1.Y-P2.Y));
    n'est pas toujours idéale en fonction de ton type de courbes. Tu peux alors jouer en modifiant la distance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:=sqrt((P1.X-P2.X)^a+(P1.Y-P2.Y)^a);
    en prenant a<1, ou a>1 (a=2 ou 3 par exemple). A toi de tester différents trucs pour tomber au mieux.

  15. #15
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    Tu veux surement parler de la distance Ln?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    c := (  (P1.X-P2.X)^n + (P1.Y-P2.Y)^n )^(1/n);
    Juste une question on peut comparer L2 à une mesure d'énergie distance dans le plan etc...
    comment interpréter les autres, L3 par exemple qu'apporte-elle de plus que L2, que gagne t'on par rapport à un cout supplémentaire?

  16. #16
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    oui, tu as raison, j'avais oublié de mettre ^1/N à la place de 1/2

    les distances L(N) (on dit Lp pour les puristes) te permettent juste d'avoir un comportement différnet de L2: ca contracte ou dilate différemment les écarts, ce qui te permet de mieux fitter avec ton type de courbes en études...

Discussions similaires

  1. Courbes roc, seuil et comparaison
    Par mathis86 dans le forum R
    Réponses: 1
    Dernier message: 26/08/2011, 10h14
  2. Comparaison de courbes
    Par bzerath dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 18/03/2011, 16h21
  3. [Débutant] Comparaison 2 courbes avec intervalles de confiances
    Par little.fredo dans le forum MATLAB
    Réponses: 0
    Dernier message: 14/08/2010, 13h27
  4. Comparaison de deux courbes
    Par stick25 dans le forum MATLAB
    Réponses: 8
    Dernier message: 29/07/2010, 21h17
  5. Comparaison de deux courbes
    Par Lost in dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 06/07/2008, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo