Régression linéaire - La méthode des moindres carrés

Le problème

Imaginez votre premier TP d'électricité. Vous disposez d'une alimentation qui peut délivrer un courant à tension constante réglable, d'une résistance de puissance suffisante (ou non, ce qui est plus amusant!), d'un ampèremètre et de câbles (supposés de résistance négligeable). L'alimentation est dotée d'un voltmètre qui indique la tension du courant délivré. Admettons que l'alimentation puisse délivrer un courant de tension variant entre 0 (à peu près) et 15 V.
Muni de ce matériel, le professeur vous demande d'établir la relation existant entre la valeur de la tension aux bornes de la résistance et l'intensité du courant circulant. Accessoirement, il vous demande de déduire de vos expériences la valeur de la résistance.
Vous allez donc construire un montage en reliant en série l'ampèremètre et la résistance, que vous brancherez aux bornes de l'alimentation. Pour établir la relation demandée, vous allez faire varier la tension du courant délivré par l'alimentation (la seule variable...) et vous lirez la valeur de l'intensité I du courant pour chaque valeur de tension U. Supposons que vous faites varier la tension de 1 V après chaque lecture de I, entre 0 et 15 V. Manip super classique au bout de laquelle vous obtiendrez un tableau de valeurs de I en fonction de U.
Vous voici donc en possession d'un tableau de mesures, comportant 16 couples (u,i). A partir de ces mesures vous devez déterminer la relation qui relie U et I.
Ce tableau pourrait être le suivant, en supposant que l'unité d'intensité choisie est le mA et celle de tension le V:

U I
0 0
1 9
2 19
3 29
4 41
5 50
6 62
7 69
8 83
9 95
10 101
11 109
12 119
13 130
14 142
15 149

Bien sur, vous savez depuis la quatrième au moins, qu'il s'agit de la loi d'Ohm (simplifiée) qui établie une relation linéaire entre U et I, de la forme célèbre U = R*I. Bon d'accord, mais comment l'établir, comment le montrer?
Premier réflexe, peut être, vous allez tracer un graphique en portant en abscisse les valeurs de tension, variant entre 0 et 15, et en ordonnée, la valeur de I mesurée pour chaque valeur de U. Si vous avez été soigneux, vous verrez que vos points sont vaguement disposés le long d'une droite que vous devinez. Vous supputez donc une relation linéaire I = a*U et il vous reste à déterminer a. Vous savez (j'espère...) que a est la pente de la droite que vous devinez et donc, avec la plus grande témérité, vous tracez une droite qui passe à peu près par tous les points ou presque, et vous calculer a.
Le principe n'est pas idiot, mais il pêche par un point : le tracé de la droite! Tel que vous le faites, il est purement "pifométrique"! Vous avez cherché à faire passer la droite le plus près du maximum de points, mais vous l'avez fait empiriquement. J'ai vu mon fils (en TS) faire ça hier sur un autre problème similaire et je me suis dit "on ne connait plus la méthode des moindres carrés en TS?" - pour la petite histoire, cette méthode est au programme des STG....
Il existe en effet une méthode rigoureuse de tracer cette droite, qu'on appelle droite de régression. Cette méthode fait partie d'une famille de méthodes, dites de régressions, qui peuvent être linéaire, polynomiale, logarithmique ou exponentielle. En gros cela signifie trouver la courbe, une droite, une courbe polynomiale, un log ou une expo, qui passe au plus près de l'ensemble des points (on dit "minimiser l'écart quadratique"!).
Dans le cas de la régression linéaire, il s'agit d'une droite, et la méthode porte le doux nom de méthode "des moindres carrés". Dans la suite de cette page, je vais tenter de vous expliquer comment la mettre en oeuvre pratiquement, après avoir abordé très succinctement sa "démonstration" mathématique.

Les bases mathématiques de la méthode des moindres carrés

Dans son principe, la méthode est simple. Voyons cela sur un schéma:

reg line 1

Voici donc une collection de n points de mesure (xi,yi) dont on suppose qu'ils sont reliés par un loi affine d'équation y = a*x + b. Le jeu étant bien sur de calculer les coefficients a et b. Ce qui est valable pour une loi affine l'est bien sur pour une loi linéaire (y=0 pour x = 0).
Vous noterez que vous supposez qu'il s'agit d'une loi affine. Vous pourriez très bien supposer qu'il s'agit d'une loi exponentionnelle, et dans ce cas vous feriez un calcul de régression exponentielle. Le choix de la nature de la courbe de régression relève de l'utilisateur selon des considérations de physique. La méthode n'est qu'un outil au service du physicien, elle ne remplace pas la compréhension physique du phénomène.
On appelle "somme des résidus" la somme S = Σ(yi - y)2, soit en remplaçant y par sa valeur S = Σ(yi - (a*xi +b))2 pour i variant de 1 à n (ou de 0 à n-1, ce qui est identique).
La méthode des moindres carrés consiste à chercher les coefficients a et b, tels que la somme S soit minimale, d'où son nom...
A partir de là, les exposés divergent. Les statisticiens font des calculs en utilisant les notions de point moyen, de variance et covariance. Les analystes remarqueront que S est minimale si la dérivée partielle de S par rapport à a et celle par rapport à b sont nulles, ce qui aboutit à un système d'équations linéaires que l'on sait facilement résoudre.
Ces notions n'étant pas au programme, je les passe. Si vraiment cela vous embête, vous pourrez trouver la démonstration sur ce cours au paragraphe 1.2.1. La démonstration basée sur les statistiques est disponible sur wikipédia (qui apparemment snobe la démonstration analytique!).
Quelle que soit la méthode, le calcul donne le même résultat pour les valeurs de a et de b, que j'ai arrangé pour programmer plus facilement :

a = (n*Σxi*yi -ΣxiΣyi) / (n*Σxi2 - (Σxi)2)

b = (1/n)(Σyi - a*Σxi)

Voilà, c'est aussi simple que ça... Evidemment faire le calcul manuellement est un peu pénible! On va donc réaliser un petit programme qui le fait pour nous. A vrai dire, vous disposez déjà tous d'un programme qui le fait, car Excel ou OpenOffice Calc disposent d'une fonction qui calcule la régression linéaire....

Sa mise en oeuvre

Ecrire un programme en C

L'écriture de la procédure de calcul des coefficients de la droite de régression est une simple application des formules données ci-dessus. Aucune complication comme vous pouvez en juger:

void RegLineaire(double x[], double y[], int n, double *a, double *b)

{

int i; double xsomme, ysomme, xysomme, xxsomme;

double ai,bi;

xsomme = 0.0; ysomme = 0.0;

xysomme = 0.0; xxsomme = 0.0;

for (i=0;i<n;i++)

{

xsomme = xsomme + x[i]; ysomme = ysomme + y[i];

xysomme = xysomme + x[i]*y[i];

xxsomme = xxsomme + x[i]*x[i];

}

ai = (n*xysomme - xsomme*ysomme)/(n*xxsomme - xsomme*xsomme);

bi = (ysomme - ai*xsomme)/n;

*a = ai;

*b = bi;

return;

}

Le programme complet, qui utilise la librairie graphique Dislin pour le tracé graphique, est très classique. Son code source RegLineaire.cpp est téléchargeable.
Son utilisation est immédiate: vous indiquez le nombre de points de mesure, vous entrez les valeurs (xi,yi) de chaque point et vous obtenez le tracé des points, de la droite de régression et les valeurs des coefficients a et b. A titre d'amélioration du programme, vous pouvez ajouter une routine qui charge les données à partir d'un fichier: c'est pénible de le faire à chaque lancement!
A titre d'exemple, voilà le graphique obtenu avec les valeurs de mesures mentionnées ci-dessus:

Nous obtenons a = 10.057 et b = 0.007, en arrondissant .
Comment répondre aux questions posées (nature de la loi, valeur de la résistance)?
La droite tracée est de la forme I = f(U), soit I = a*U + b. La très faible valeur de b nous fait penser qu'il peut s'agir d'une fonction linéaire, et donc que nous pouvons écrire I = a*U ou bien, comme demandé par votre professeur U = (1/a)*I.
La résistance est donc égale à 1/a. Attention aux unités, I dans notre tableau est exprimée en mA. Nous obtenons donc une valeur de résistance égale à (1/10)*10^3 environ, c'est à dire environ 100 ohm, aux incertitudes de mesure près.

Utiliser Scilab

La programmation est plus simple! Nous utiliserons la fonction Regress(X,Y) de Scilab, qui retourne les coefficients a et b de la droite de régression dans un vecteur ligne [a,b]. Attention, Scilab pose l'équation Y = a + b*X, ce qui n'est pas notre notation Y = a*X + b. Il ne faudra donc pas oublier de changer la signification du a de Scilab, qui est notre b, et celle du b, qui est notre a.
Le programme RegLineaire.sce est téléchargeable. Voilà le résultat obtenu:

Les valeurs de a et de b, visibles dans la fenêtre d'exécution de Scilab, sont identiques à celles obtenues avec le progamme en C. La droite de régression est elle aussi identique. L'économie de moyens obtenue avec Scilab est confirmée...

Utiliser Excel

On peut très facilement réaliser une régression linéaire (et même les autres) avec Excel ! On utilise pour cela la fonction DROITEREG prédéfinie. Voyons sur la copie d'écran suivante ce que cela donne:

Les données X sont stockées en colonne de A2:A17, les données Y sont stockées dans la colonne B2:B17.
Les coefficients a et b sont calculés dans les cases D3 et D4 par appel de la fonction DROITEREG et extraction de la matrice de retour [a,b] par la fonction INDEX. Pour plus de renseignements sur DROITEREG et INDEX, consultez l'aide Excel... La feuille de calcul Reglin.xls est téléchargeable. Encore une fois, nous obtenons les mêmes résultats.
Je n'ai pas fait l'exercice sous OpenOffice Calc, mais le principe est identique, la syntaxe pouvant être légèrement différente. En cas de difficulté, consultez l'aide de Calc...


Contenu et design par Dominique Lefebvre - www.tangenteX.com mars 2013    Licence Creative Commons   Contact : PhysiqueX ou

Cette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France.