@@ -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}$$
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.