diff --git a/README.md b/README.md index 7915cea6a965fee089a96b3f4b5e009cfeeb25e6..bdcfb4b524cd69e9b1f6558e4227a1683f830d60 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,17 @@ Alexandre Benzonana & Kelly Nguyen --- # Table des matières -- [Introduction](#introduction) -- [Explication mathématique](#Explication_mathématique) - - [Solution Analytique](#Solution_Analytique) - - [Solution Numérique](#Solution_Numérique) - - [Partie Test](#Partie_Test) - - [Cross Validation](#Cross_Validation) - - [Calculs d'erreurs](#Calculs_d'erreurs) -- [Résultats](#Résultats) -- [Conclusion](#Conclusion) +- Introduction +- Explication mathématique + - Solution Analytique + - Solution Numérique + - Partie Test + - Cross Validation + - Calculs d'erreurs + - Test 1 + - Test 2 +- Résultats +- Conclusion --- # Introduction @@ -23,9 +25,9 @@ Pour la structure de notre rapport, nous avons divisé les explications mathéma Pour la partie analytique, nous expliquons comment nous avons trouvé les équations permettant de faire la descente de gradient. Pour la solution numérique, nous expliquons comment sont utilisés les équations trouvées dans la partie précédente. -La partie test explique comment nous avons testé nos différents résultats pour terrifier leur cohérence. +La partie test explique comment nous avons testé nos différents résultats pour vérifier leur cohérence. -La partie cross validation explique comment nous avons vérifié que notre code nous rendait bien le résultat attendu. +La partie validation croisée explique comment nous avons vérifié que notre code nous rendait bien le résultat attendu. Pour finir, nous montrons les différents résultats que nous avons pu obtenir en faisant des régressions linéaires. @@ -33,7 +35,7 @@ Pour finir, nous montrons les différents résultats que nous avons pu obtenir e ## Solution Analytique -Pour faire la régression linéaire, nous avons d'abord dérivé l'équation puis isolé a et b a partir de la dérivée: +Pour faire la régression linéaire, nous avons d'abord dérivé l'équation puis isolé *a* et *b* à partir de la dérivée: $$E(a, b) = \sum^N_{j=1} (a \cdot x_j + b - y_j)^2 \tag{1}$$ @@ -41,7 +43,7 @@ $$a=\frac{-b \cdot \displaystyle\sum^N_{j=1} x_j + \sum^N_{j=1} x_j \cdot y_j}{ $$b = -\frac{a\cdot \displaystyle\sum^N_{j=1} x_j - \sum^N_{j=1} y_j}{N} \tag{3}$$ -Puis, nous avons remplacé a et b dans les équations pour les isoler. +Puis, nous avons remplacé *a* et *b* dans les équations pour les isoler. $$a = \frac {\displaystyle\sum^N_{j=1} x_j \cdot y_j} @@ -60,7 +62,7 @@ $$b = \frac{ ## Solution Numérique -À partir des formules trouvées (formule 2 et 3), nous avons implémenté la descente de gradient. Nous choisissons un a et b de départ aléatoirement puis utilisons cette formule pour nous rapprocher le plus possible du vrai a et b : +À partir des formules trouvées (formule 2 et 3), nous avons implémenté la descente de gradient. Nous choisissons un *a* et *b* de départ aléatoirement puis utilisons cette formule pour nous rapprocher le plus possible du vrai *a* et *b* : $$\begin{pmatrix} a_i + 1 \\ @@ -94,24 +96,24 @@ Nous avons choisis $\epsilon = 1*10^{-8}$ ## Partie de Test -Pour tester nos formules de la solution analytique, nous avons choisi des points alignés avec une pente de 1 et avons simplement calculé a et b en fonction de ces points avec nos formules. +Pour tester nos formules de la solution analytique, nous avons choisi des points alignés avec une pente de 1 et avons simplement calculé *a* et *b* en fonction de ces points avec nos formules. -Pour pouvoir tester notre programme, nous avons commencé par entrer les même données que lors du test de la partie analytique pour les comparer puis nous avons créée un nuage de points ($x_j$, $y_j$) qui se trouve autour d'une droite dont la pente est de *c* et l'ordonnée à l'origine *d*. Les valeurs $x_j$ sont entre deux bornes que nous avons choisi. À partir du $x_j$ on calcule le $y_j$. +Pour pouvoir tester notre programme, nous avons commencé par entrer les même données que lors du test de la partie analytique pour les comparer, puis nous avons créée un nuage de points ($x_j$, $y_j$) qui se trouve autour d'une droite dont la pente est de *c* et l'ordonnée à l'origine *d*. Les valeurs $x_j$ sont entre deux bornes que nous avons choisi. À partir du $x_j$ on calcule le $y_j$. $$y_j = c \cdot x_j + d + r_j \tag{7}$$ $$r_j \text{ est une valeur aléatoire petite.}\\ \text{(nous avons pris entre 0 et 0.1)}$$ -A cause d'un manque de précision, nous sommes contraints d'avoir : +À cause d'un manque de précision, nous sommes contraints d'avoir : $x_j \in$ [0, 1] c, d $\in$ [0, 1] -## Cross validation +## Validation croisée -Une fois le code implémenté, il faut maintenant vérifier si les valeurs de a et b restent cohérents après avoir ajouté des points. Mais pour simplifier cette validation, nous avons fait 3 groupes de points qui sont de la même taille. Nous prenons ensuite 2 parties pour entrainer le modèle et un partie pour le vérifier et répétons cette opération avec les différentes combinaisons possibles : +Une fois le code implémenté, il faut maintenant vérifier si les valeurs de *a* et *b* restent cohérentes après avoir ajouté des points. Mais pour simplifier cette validation, nous avons fait 3 groupes de points qui sont de la même taille. Nous prenons ensuite 2 parties pour entrainer le modèle et une partie pour le vérifier et répétons cette opération avec les différentes combinaisons possibles : - trouver a et b avec les groupes G1 $\cup$ G2 et tester sur G3 - trouver a et b avec les groupes G1 $\cup$ G3 et tester sur G2 @@ -157,15 +159,16 @@ Sur un nombre de points faibles l'erreur est assez importante mais plus nous aug # Résultats -Nous avons commencé par afficher les valeurs a et b dans la console pour les vérifier puis pour afficher nos graphiques nous avons décidé d'utiliser python par soucis de simplicité. Nos données étant calculés en C nous avons du trouver un moyen de les transmettre a python pour ensuite les afficher. Pour ce faire nous avons eu l'idée de les écrire dans un fichier puis lire ce fichier en python. +Nous avons commencé par afficher les valeurs *a* et *b* dans la console pour les vérifier. Puis pour afficher nos graphiques nous avons décidé d'utiliser python par soucis de simplicité. Nos données étant calculés en C, nous avons dû trouver un moyen de les transmettre à python pour ensuite les afficher. Pour ce faire, nous avons eu l'idée de les écrire dans un fichier puis lire ce fichier en python. Nous pouvons voir que la régression linéaire fonctionne car la ligne se trouve au centre des points. +  Résultats -En choisissant un $r_j$ trop élevé nous nous retrouvons avec une droite presque plate visuellement. Elle ne nous permet donc pas de voir si la régression linéaire est correcte. +En choisissant un $r_j$ trop élevé, nous nous retrouvons avec une droite presque plate visuellement. Elle ne nous permet donc pas de voir si la régression linéaire est correcte.  @@ -191,6 +194,6 @@ Nous avons pu constater que la régression linéaire ne nous apporte pas une sol Le nombre de points a également une influence pour la validation des résultats, avec un nombre de points faible les résultats ne seront pas cohérents alors qu'avec un nombre de points important les résultats ont beaucoup plus de sens. -Si notre droite est générée avec une pente faible, nous nous retrouvons avec un graphique remplis de points et la régression semble approximative tandis qu'avec une pente élevée, les points se retrouvent tous sur la droite. Ceci dépend également du nombre de points du nuage, une pente faible avec peu de points nous donnera les résultats les moins cohérents surtout lors de la validation croisée. +Si notre droite est générée avec une pente faible, nous nous retrouvons avec un graphique rempli de points et la régression semble approximative tandis qu'avec une pente élevée, les points se retrouvent tous sur la droite. Ceci dépend également du nombre de points du nuage, une pente faible avec peu de points nous donnera les résultats les moins cohérents surtout lors de la validation croisée. -Le code pourrait-être retravaillé pour le rendre plus propre avec moins de répétitions. +Le code pourrait-être retravaillé pour le rendre plus propre avec moins de répétitions. Programmer le tout en python aurait probablement été plus simple. diff --git a/TP01_-_Optimisation.pdf b/TP01-Optimisation.pdf similarity index 90% rename from TP01_-_Optimisation.pdf rename to TP01-Optimisation.pdf index 1b35d9f41717aac379930dad98369a5dffa59d4c..fd499d76a417b5b763aadc1f28f9a77b44bbeed7 100644 Binary files a/TP01_-_Optimisation.pdf and b/TP01-Optimisation.pdf differ