diff --git a/travaux_pratiques/tpOptimisation/tpOptimisation.md b/travaux_pratiques/tpOptimisation/tpOptimisation.md index 49f863043d728ddc19a55a5d15dc9060685fc58c..55b2bdc97bff8d91bf59ddfb81e6380fa2b66664 100644 --- a/travaux_pratiques/tpOptimisation/tpOptimisation.md +++ b/travaux_pratiques/tpOptimisation/tpOptimisation.md @@ -31,7 +31,7 @@ include-before: <script src="css/prism.js"></script> * Réaliser un programme permettant de réaliser une régression linéaire à l'aide de la méthode de la descente de gradient. -* Tester ce programme sur des données synthétiques afin de valider +* Tester ce programme sur des données synthétiques (générées aléatoirement) afin de valider votre implémentation. # Travail à réaliser @@ -45,8 +45,8 @@ Afin de *valider* votre implémentation, il faut d'abord est aisé. On va chercher "la meilleure droite" -passant par un ensemble de points $\{(x_j, y_j)\}_{j=1}^N$. -Comme on l'a vu en cours, on cherche à minimiser la fonction de coût +passant par un ensemble de points $\{(x_j, y_j)\}_{j=1}^N$ (Ex pour $N=3\ :\ \{(x_1,y_1), (x_2, y_2), (x_3, y_3)\}_{j=1}^3$). +Comme on l'a vu en cours, on cherche à minimiser la fonction de coût (erreur quadratique) $$ E(a,b)=\sum_{j=1}^N(a\cdot x_j + b - y_j)^2. $$ @@ -68,7 +68,7 @@ En prenant comme référence la solution ci-dessus, il faut à présent implémenter la méthode de la descente de gradient pour minimiser $E(a,b)$. -En partant d'une pente $a_0$ et d'une ordonnée à l'origine $b_0$, +En partant d'une pente $a_0$ et d'une ordonnée à l'origine $b_0$ (choisies aléatoirement), il faut itérativement construire de meilleures approximations $$ \vectwo{a_{i+1}}{b_{i+1}}=\vectwo{a_i}{b_i}-\lambda \cdot \vec\nabla E(a_i, b_i), @@ -82,18 +82,16 @@ où $\varepsilon>0$ est la précision souhaitée. ### Test -Afin de tester votre programme, vous devez générer un nuage de points. -Pour contrôler au mieux ce qui se passe, il est recommandé -de générer des points aléatoirement le long d'une droite, -et de bruiter un peu le résultat. Vous choisissez -$x_j$ entre deux bornes de votre choix (p.ex. 0 et 10) -puis tirez un certain nombre de $x_j$. A partir de là -vous construisez $y_j$ comme +Afin de tester votre programme, vous devez générer un nuage de points $\{(x_j, y_j)\}_{j=1}^N$ aléatoirement. +Pour contrôler au mieux ce qu'il se passe, il est recommandé +de générer ces points aléatoirement le long d'une droite de pente $c$ et une ordonnée à l'origine $d$ que vous choisirez, +et de bruiter un peu le résultat. Pour générer aléatoirement un point $(x_j, y_j)$, vous choisissez +$x_j$ entre deux bornes de votre choix (p.ex. 0 et 1) +puis, à partir de là vous construisez $y_j$ comme $$ y_j=c\cdot x_j+d + r_j, $$ -où $|r_j|$ est un "petit" nombre aléatoire devant $(c\cdot x_j+d)$, et $c$ et $d$ -(la pente et l'ordonnée à l'origine de votre droite) sont choisis par vos soins. +où $|r_j|$ est un "petit" nombre aléatoire devant $(c\cdot x_j+d)$. Il faut vous assurer que la solution analytique et la solution numérique soient très proches (à $\varepsilon$ près) et qu'elles soient également assez proches @@ -106,6 +104,16 @@ Faites également varier la valeur maximale de $|r_j|$. Que se passe-t-il quand $|r_j|$ devient trop grand? N'hésitez pas à représenter graphiquement vos résultats. +**Important** : Pour des raisons de pertes de précision obtenus après des calculs itératifs sur des nombres à virgule flottante. +Vous devrez choisir des valeurs avec les contraintes suivantes : +$$\begin{aligned} +x_j &\in\ [0,1]\\ +c,d &\in\ )0,1] +\end{aligned} +$$ + +(Note : En pratique le domaine de nos données n'est pas restraint. On effectue donc une normalisation de nos données avant et après le calcul des paramètres de notre modèle.) + ## Validation du modèle de régression Lorsqu'on réalise une régression, on *modélise* @@ -120,11 +128,11 @@ Il en existe un grand nombre de variantes, ici nous n'en verrons qu'une. Il s'agit ici de vérifier si le $a$ et le $b$ que nous avons déterminés sont des valeurs qui continueraient à être correctes -si on ajoutait de nouveaux points à notre ensemble $\{(x_j, y_j)\}_{j=1}^N$. +si on ajoutait de nouveaux points à notre ensemble $\{(x_j, y_j)\}_{j=1}^N$ (issues du même phénomène). Il est souvent peu pratique de générer de nouveaux points, on se contente donc de diviser notre jeu de données en plusieurs partie. Une partie des points sera utilisée pour *entraîner* notre modèle (déterminer -un $a$ et un $b$) l'autre partie sera utilisée pour tester le modèle, +un $a$ et un $b$) l'autre partie sera utilisée pour *tester* le modèle, on calculera l'erreur effective $E(a,b)$ par rapport à cette seconde partie des points.