Regression linéaire (polynomiale) en 5 lignes de code (Matlab !)

    Voici un petit script matlab pour faire une regression linéaire sur un ensemble de points.

    • Exemple 1 :

    Dans l’exemple ci-dessous, on veut mesurer une tension (pour faire un voltmètre, garder un oeil sur la tension d’une batterie, …). On veut, à partir d’une valeur renvoyée par un convertisseur analogique/numérique, retrouver la tension en entrée.

    On fait tout d’abord un relevé en fixant une tension en entrée et en notant la valeur ADC mesurée. J’obtiens les valeurs suivantes dans mon cas (il s’agit de valeurs réelles !) :

    1
    2
    y=[6.39, 7.59, 8.585, 9.3, 9.88, 11.14, 11.785]'; %valeurs en V lues à l'oscillo
    x=[265, 317, 359, 391, 416, 468, 496]'; %valeurs correspondantes issues de l'ADC

    En traçant les données, on obtient la figure suivante :

    On veut donc trouver la fonction qui nous permettra de trouver la tension correspondant à une valeur ADC. Voici le code pour trouver la droite optimale :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    figure(); hold on;
    plot(x,y,'bx','linewidth',2,'MarkerSize',5); %tracé des données
    X=[ones(length(x),1), x];
    theta=zeros(size(X,2),1); %vecteur qui contiendra les coefs
    theta=pinv(X'*X)*X'*y %équation normale, donne les valeurs optimales (qui minimisent l'erreur) pour les coefs
    %pinv pour pseudo inverse au lieu de inv(X'*X)*X'
    plot(x, X*theta, 'r', 'linewidth', 2);
    xlabel('x'); ylabel('y');
    legend('données', strcat('equation de la droite :',sprintf('\ny = %5.3f + %5.3f*x', theta)));
    grid minor;

    En le lançant, on obtient la droite suivante, avec l’équation correspondante :

    Victoire !

    Vous me direz qu’on pourrait avoir cette équation de manière théorique, en connaissant les caractéristiques du convertisseur (nombre de bits, pleine échelle, …). Oui, c’est vrai. Mais l’intérêt ici c’est qu’on fait une calibration en même temps. C’est-à-dire qu’on trouve la droite optimale, qui prend en compte les erreurs de mesure. Même si on a un système dont on ne connait pas tous les paramètres, on est capable de trouver la relation.

     

    • Exemple 2 :
    Dans ce second exemple, on va faire toujours une régression linéaire, mais cette fois à l’ordre 2. On va donc chercher un polynôme de la forme $$y=a*x^{2}+b*x+c$$ qui colle de manière optimale à un ensemble de points. Vous pourrez très facilement adapter le script pour un ordre supérieur ou pour un plus grand nombre de paramètres.

     
    Il s’agit ici de données réelles issues d’un baromètre monté à bord d’un projectile. Voici le fichier. Malheureusement, seule une partie de la trajectoire a été enregistrée, au voisinage de l’apogée. Grâce à notre interpolation, on va pouvoir estimer les bouts de trajectoire inconnus.

    Voila le script :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    close all;clear all;clc;
    data=load('data.txt');
    figure(); hold on;
    t=data(:,1);    %temps en secondes (fréquence d'échantillonnage : 50Hz)
    alt=data(:,2);  %altitude en m
    plot(t,alt,'b.','linewidth',2,'MarkerSize',5); %tracé des données

    X=[ones(length(t),1), t, t.^2]; %remarquez l'ajout du t.^2 !!
    theta=zeros(size(X,2),1);
    theta=pinv(X'*X)*X'*alt
    plot(t, X*theta, 'r', 'linewidth', 2);
    xlabel('temps (s)'); ylabel('altitude (m)');
    legend('données', strcat('equation :',sprintf('\ny = %5.3f + %5.3f*x + %5.3f*x^2', theta)));
    grid minor;

    Et la courbe obtenue :

    Pas mal, non ?

    Pour la théorie sur ce qu’on vient de faire, wikipedia l’expliquera mieux que moi :

    Régression linéaire

    Méthode des moindre carrés

    Tags: , , , ,

    1. Bastien’s avatar

      Très intéressant, la théorie est également expliquée ici : http://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html

      Une question cependant : comment extraire (en matlab) les coefficients a, b et c du meilleur polynôme ?

        (Citer)

      Répondre

      1. rousselmanu’s avatar

        Merci !!
        Les coefficients sont dans le vecteur « theta ». C’est un vecteur colonne avec les 3 coefs.
        Tu peux les extraire comme ça :
        a=theta(3)
        b=theta(2)
        c=theta(1)

          (Citer)

        Répondre

      2. sara’s avatar

        bonjour,
        l’équation suivante: γx = γx0 + aα + bβ +pπ*
        comment peut on utiliser le matlab pour la tracer.
        svp aidez moi c’est très urgent
        merci d’avance

          (Citer)

        Répondre

        1. rousselmanu’s avatar

          Elle est un peu floue, ta question ! Et HS en plus :)
          Regarde la fonction plot() (et l’aide de matlab pr savoir comment l’utiliser)

            (Citer)

          Répondre

        2. sadoune nadir’s avatar

          bonjour
          comment faire de la regression avec les réseaux de neurone (dans le cadre de pronostic: c.a.d la prédiction)
          mercii

            (Citer)

          Répondre

          1. loulita’s avatar

            sadoune nadir:
            bonjour
            comment faire de la regression avec les réseaux de neurone (dans le cadre de pronostic: c.a.d la prédiction)
            mercii

            Est ce que vous avez trouvé la réponse, je blok la dessus aussi

              (Citer)

            Répondre

          2. sdecorme’s avatar

            Bonjour,
            Comment je peux calculer l’équation de la perpendiculaire en un point à la courbe de second ordre ?
            Merci

              (Citer)

            Répondre

          3. khlifi ines’s avatar

            je débute tout juste matlab (gui) et je voudrais représenter graphiquement sur matlab 3 cercle à partir de son équation cartésienne :
            x² + y² – 2x -4y – 4 = 0
            svp repond moi et merci

              (Citer)

            Répondre

    Reply to khlifi ines Annuler la réponse.

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>