# Découvrir Scilab/Régression

Table des matières — Index
6. Régression
Présentation du problème
Le problème a des similarités avec celui de l'interpolation : on a des points expérimentaux (x$_i$, y$_i$), et l'on détermine une fonction décrivant ces points. Les différences majeures sont :
* la fonction est déterminée sur l'ensemble de définition complet, à partir de tous les points, et non pas par morceaux entre deux points ;
* la fonctions ne passe en général pas par les points expérimentaux mais près de ces points.
Par ailleurs, la forme de la fonction est souvent déterminée par le type de problème auquel on s'attaque, elle a un « sens physique », là où l'interpolation se contente de prendre des fonctions simples.
Considérons un nuage de n points « expérimentaux » (X, Y) : X et Y sont des vecteurs
* X = [X$_1$ ; X$_2$ ; … ; X$_n$] ;
* Y = [Y$_1$ ; Y$_2$ ; … ; Y$_n$].
Considérons une fonction « modèle » y = ƒ(A, x) où A est un vecteur ; les valeurs de A sont des paramètres de la fonction ƒ, par exemple :
* ƒ(A, x) = A(1)·exp((x - A(2))$^2$/A(3)) : une fonction gaussienne ;
* ƒ(A, x) = A(1)·x$^3$ + A(2)·x$^2$ + A(3)·x + A(4) : un polynôme de degré 3.
La régression consiste à trouver le vecteur A tel que la fonction ƒ « colle le mieux » au nuage de points. On utilise pour cela la méthode des moindres carrés (least square) :
* on définit la fonction « résidus » r(A, x, y) entre le modèle et les points expérimentaux :
    r(A, x, y) = y - ƒ(A, x) ;
* on définit la somme S des carrés des résidus comme étant :
    S = ∑$_i$ r$^2$(A, X$_i$, Y$_i$) ;
la régression par la méthode des moindres carrés consiste donc à trouver le vecteur A donnant la valeur minimale de S.

## Régression linéaire
### Régression linéaire simple

Dans le cas de la régression linéaire, la fonction modèle ƒ est une fonction affine :
    ƒ(A, x) = A(1)·x + A(2).
Comme il n'y a que deux paramètres dans le modèle, on note ceux-ci a et b :
    ƒ(a, b, x) = a·x + b.
D'une certaine manière, la régression consiste à résoudre un système d'équations surdéterminé (chaque point expérimental étant une équation, il y a plus d'équations que d'inconnues) :
    ${\begin{cases}ax_{1}+b=y_{1}\\ax_{2}+b=y_{2}\\\ldots \\ax_{n}+b=y_{n}\\\end{cases}}$
ce qui peut s'écrire sous forme matricielle
    A×X = Y
avec
    A = (a b)
    $\mathrm {X} ={\begin{pmatrix}x_{1}&x_{2}&\ldots &x_{n}\\1&1&\ldots &1\\\end{pmatrix}}$
    Y = (y$_1$ y$_2$ … y$_n$)
Si l'on demande à Scilab de résoudre le système avec la division matricielle alors que la matrice X n'est pas carrée, il effectue automatiquement une régression linéaire des moindres carrés :
Si l'on veut forcer l'ordonnée à l'origine à 0, il suffit de ne pas mettre la ligne de 1 :
On peut aussi travailler avec des vecteurs colonne, et utiliser l'autre diviseur matriciel A = x\y.
Mais la méthode de la division matricielle ne donne pas d'autre information que les coefficients, et en particulier ne donne pas le résidu.
Pour cela, on peut utiliser la fonction reglin, avec la syntaxe :
On peut aussi utiliser la commande regress. Elle ne permet pas d'obtenir l'écart type, et ne fonctionne qu'avec deux variables, mais par contre, les vecteurs peuvent être indifféremment ligne ou colonne ; ils peuvent même être de types différents (un vecteur ligne et l'autre colonne).
Exemple
Dans l'exemple suivant, on génère des points dispersés aléatoirement autour d'une droite y = pente*x + ordonnee, puis on fait la régression linéaire de ce nuage de points.
Pour clarifier le code source, le programme est scindé en trois fichiers situés dans le même répertoire (dossier) appelé ici monrepertoire/ :
* le fichier fonction.sce qui contient la fonction affine ;
* le fichier generation.sce qui crée un nuage de points et le met dans le fichier donnees.txt ;
* le fichier regression.sce qui lit le fichier donnees.txt et effectue la régression.
    Fichier fonction.sce
    Fichier generation.sce
    Fichier regression.sce
Comme la forme de la fonction ƒ est connue, il est inutile de la définir. La fonction reglin retourne un vecteur de trois composantes : les paramètres a et b du modèle, et l'écart type σ du résidu (qui est la racine carrée de la somme des carrés des résidus, σ = √S).

### Régression multilinéaire

Notons que a, b, x et y peuvent être des vecteurs. Si par exemple on a un modèle linéaire à plusieurs variables :
    ƒ(a$_1$, a$_2$, …, a$_m$, b, x$_1$, x$_2$, …x$_n$) = a$_1$·x$_1$ + a$_2$·x$_2$ + … + a$_n$·x$_n$ + b
alors il suffit de définir X comme étant une matrice m×n
où X$_{ij}$ est la valeur de x$_j$ pour le point de mesure i ; et de définir Y comme étant un vecteur ligne de n valeurs
et le paramètre a retourné par la division matricielle ou par la fonction reglin est le vecteur [a$_1$, a$_2$, … , a$_n$].

## Régression polynomiale

La régression polynomiale est un cas particulier de régression multilinéaire.
    Pour plus de détails voir : wikipedia:fr:Régression polynomiale.
Voici par exemple un programme générant n points pour x allant de 0 à 5 (valeurs exactes), et y suivant le polynôme x$^3$ - 2·x$^2$ + 3·x - 4, bruité :
Et voici un programme permettant d'effectuer la régression sur ces données :

## Régression non-linéaire

Dans le cas de la régression non-linéaire, ƒ est une fonction quelconque. Pour effectuer la régression, on utilise la fonction leastsq avec la syntaxe suivante :
Avec cette syntaxe, la fonction leastsq retourne donc un vecteur :
* le premier élément, S, est la valeur de la somme des carrés des écarts ;
* le second élément, Aopt, est le vecteur contenant la valeur « optimisée » des paramètres du modèle.
Exemple 1
Nous reprenons l'exemple de la régression linéaire, mais en utilisant cette fois-ci la fonction leastsq. Lorsque l'on enregistre les données générées, on utilise :
afin d'avoir des vecteurs colonne.
Exemple 2
Nous travaillons ici avec un pic généré par la somme d'une fonction gaussienne et d'une fonction lorentzienne. Ce genre de profil est classiquement utilisé pour décrire la forme des pics obtenus par diffractométrie X. On fait ce que l'on appelle une désommation de pics (on parle souvent de « déconvolution », mais ce terme est abusif puisqu'il ne s'agit pas de produit de convolution).
L'algorithme par défaut de leastsq est l'algorithme de pseudo-Newton. On peut aussi utiliser l'algorithme du gradient conjugué en ajoutant "gc" aux paramètres, ou bien algorithme foncitonnant avec les fonctions non-différentiables avec "nd". On peut enfin utiliser la commande lsqrsolve, qui utilise l'algorithme de Levenberg-Marquardt.

## Notes

Interpolation, extrapolation et lissage < ↑ > Calcul différentiel et intégral