Skip to content
Snippets Groups Projects
Commit 4dc66916 authored by ExtraDev's avatar ExtraDev
Browse files

Prépration du rendu

parent 61a70002
No related branches found
No related tags found
No related merge requests found
Showing with 52 additions and 23 deletions
*.pdf
*.o
*.out
\ No newline at end of file
*.out
*.vec
__pycache__/
.vscode
\ No newline at end of file
......@@ -12,7 +12,7 @@ Dans le cadre du cours de mathématiques en technologie de l’information nous
En effet, le but est de mettre en pratique les connaissances acquises durant le premier semestre 2021 qui portait sur les fonctions, dérivées, minimum et maximum d'une fonction et optimisation de celles-ci.
Plus précisément, notre objectif dans ce travail est de trouver la meilleur droite passant par un nuage de point(x,y) généré de manière pseudo aléatoire sur un plan 2D.
Plus précisément, notre objectif dans ce travail est de trouver la meilleure droite passant par un nuage de point(x,y) généré de manière pseudo aléatoire sur un plan 2D.
Ci-dessous un exemple du résultat attendu:
......@@ -21,11 +21,11 @@ Ci-dessous un exemple du résultat attendu:
# Solution analytique
## Minimisation de la fonction de coût
En premier lieux, nous avons cherchons à minimiser la fonction de coût (Erreur quadratique):
En premier lieux, nous avons cherché à minimiser la fonction de coût (Erreur quadratique):
E(a,b) = $\sum_{j=1}^N (a * x_{j} + b - y_{j})^2$
En résolvant le système de deux équations à deux inconnues. Ce sont avec ces équations que nous allons pouvoir réaliser notre solutions numérique.
En résolvant le système de deux équations à deux inconnues. Ce sont avec ces équations que nous allons pouvoir réaliser notre solution numérique.
Nous allons d'abord chercher la dérivée en **a** et en **b** de la fonction de cout.
......@@ -41,9 +41,9 @@ a : $\sum{({ax_{j}}^2 + bx_{j} - x_{j}y_{j})} = a\sum{{x_{j}}^2} + b\sum{x_{j}}
b : $\sum{(ax_{j} + b_{j} - y_{j})} = a\sum{x_{j}} + \sum{}b\ - \sum{y_{j}} = a\sum{x_{j}} + Nb - \sum{y_{j}} = 0$
Afin d'obtenir une formule **a** et **b** ayant que des constantes en paramètre (nos sommes de points), il faut résoudre ce sytème à deux equations.
Afin d'obtenir une formule **a** et **b** ayant que des constantes en paramètre (nos sommes de points), il faut résoudre ce système à deux équations.
Pour nous symplifier dans l'écriture des fonctions et par la suite dans notre code, on va définir les sommes par des variables:
Pour nous simplifier dans l'écriture des fonctions et par la suite dans notre code, on va définir les sommes par des variables:
$A = \sum{{x_{j}}^2}$
......@@ -85,7 +85,7 @@ $a = \frac{-BD + CN}{AN - {B}^2}$
$a = \frac{CN - BD}{AN - {B}^2}$
On a alors obtenu **a**, il nous reste plus qu'a l'insérer dans la formule de **b**, pour obtenir **b** sans variable.
On a alors obtenu **a**, il nous reste plus qu'à l'insérer dans la formule de **b**, pour obtenir **b** sans variable.
On obtient:
......@@ -94,16 +94,16 @@ $b = -a\frac{B}{N} + \frac{D}{N} = -(\frac{CN - BD}{AN - {B}^2})\frac{B}{N} + \
$b = -(\frac{CNB - {B^2}D}{{AN^2} - {B^2}N}) + \frac{D}{N}$
## Vérifications
On peux tester nos deux formules dans un excel par exemple pour s'assurer de la justesse des transformation.
On peut tester nos deux formules dans un tableur pour s'assurer de la justesse des transformations.
On vas donc génerer un nuage de points suivant une droite, puis calculer nos deux formules en rentrant comme paramètre les differentes sommes de points.
On va donc générer un nuage de points suivant une droite, puis calculer nos deux formules en rentrant comme paramètre les differentes sommes de points.
ce qui vas nous donner un premier resultat (Solution analitique a et b) que l'on peut comparer avec l'équation de la courbe de tendance lineaire calculée par excel.
ce qui va nous donner un premier résultat (Solution analytique a et b) que l'on peut comparer avec l'équation de la courbe de tendance linéaire calculée par le tableur.
![Vérification via un tableur](./doc/screenshots/verification.png)
On compart donc que les deux resultats sont identiques sur la base d'affichage des nombres a virgules obtenu.
De cette façon, nous avons pû confirmer la qualité de nos calculs, mais aussi de s'avoir à quoi s'attendre en therme de résultat par la suite.
On compare donc que les deux résultats sont identiques sur la base d'affichage des nombres a virgules obtenu.
De cette façon, nous avons pu confirmer la qualité de nos calculs, mais aussi savoir à quoi s'attendre en terme de résultat par la suite.
À partir de ce moment là, on en a déduit que les équations obtenues en **A** et **B** sont correcte.
......@@ -117,7 +117,7 @@ Nous parlons de points pseudo aléatoire car, ils sont en réalité générés a
En effet, de cette façon on s'assure que la droite que nous souhaitons retrouver ressemble à celle qui a permis de générer les points aléatoire...
## Descente de gradient
Pour trouver la meilleure droite passant par le nuage de points, nous devont appliquer la descente de gradient. En effet, c'est cette formule qui nous permettra de retrouver l'ordonnée à l'origine ainsi que la pente de la meilleur droite.
Pour trouver la meilleure droite passant par le nuage de points, nous devons appliquer la descente de gradient. En effet, c'est cette formule qui nous permettra de retrouver l'ordonnée à l'origine ainsi que la pente de la meilleure droite.
Sur notre nuage de points nous avons appliqué la formule suivante :
......@@ -143,23 +143,21 @@ $\lambda$ = 0,001
N = Nombre de point
Et nous nous sommes arrêté quand le $\epsilon$ était inférieur à 0.001 ce qui représente environ 385 itération sur 30 points.
## Validation du modèle de régression
La validation croisée consiste à valider la descente de dradient de notre droite sur plusieurs échantillons de données.
La validation croisée consiste à valider la descente de gradient de notre droite sur plusieurs échantillons de données.
Il a donc fallu en premier temps séparer de manière aléatoire notre nuage de points en trois groupes distincts. Par la suite, le calcule de la descente du gradient est appliqué sur chacun des groupe. Le but de cette opération est de retrouvé dans chacun des groupes des droites similaires à celle trouvée au départ avec le nuage complet. Cela a pour but de valider nos résultats!
Il a donc fallu dans un premier temps séparer de manière aléatoire notre nuage de points en trois groupes distincts. Par la suite, le calcule de la descente du gradient est appliqué sur chacun des groupe. Le but de cette opération est de retrouvé dans chacun des groupes des droites similaires à celle trouvée au départ avec le nuage complet.
![Validation croisée, descente de gradient](./doc/screenshots/validation_croisee.png){width=400px}
## Erreur quadratique
L'erreur quadratique va nous donner un indice de précision dans le calcul de la descente de gradient. Plus la valeur de l'erreur quadratique est petite, mieux c'est.
L'erreur quadratique va nous donner un indice de précision dans le calcul de la descente de gradient. Plus la valeur de lerreur quadratique est petite plus grande est la précision.
En voici la formule :
E(a,b) = $\sum_{j=1}^N (a * x_{j} + b - y_{j})^2$
# Résultats
Comme nous avons pu le voir dans les figures précédentes, nous avons obtenu des résultats concluents. J'entends pas là que aussi bien la droite obtenue sur la descente de gradient avec le nuage complet **et** les droits obtenues sur la validation croisée se ressemble et semblent juste au niveau de nos nuage de points.
Comme nous avons pu le voir dans les figures précédentes, nous avons obtenu des résultats concluants. J'entends par là qu'aussi bien la droite obtenue sur la descente de gradient avec le nuage complet **et** les droites obtenues sur la validation croisée se ressemble et semblent juste au niveau de nos nuages de points.
Voici un tableau des données obtenues:
......@@ -178,14 +176,14 @@ Voici un tableau des données obtenues:
| Groupe 0-2 et G1 | -0.024588; -0.042307 | 2.104142 |
| Groupe 1-2 et G0 | 0.024588; 0.042307 | 0.654723 |
On peut constater une différence de précision au niveau de l'erreur quadratique. En effet, l'erreur quadratique obtenue pendant la validation croisée par chacun des groupes sont bien plus petites que cette optenue sur le nuage complet. On peut en déduire qu'il est préférable de réaliser la descente de gradient sur des lots données pas trop volumineux et de vérifier l'écart de chacun des résultats afin de s'assurer que le résultat obtenu soit le plus juste possible.
On peut constater une différence de précision au niveau de l'erreur quadratique. En effet, l'erreur quadratique obtenue pendant la validation croisée par chacun des groupes sont plus petites que cette obtenue sur le nuage complet. On peut en déduire qu'il est préférable de réaliser la descente de gradient sur des lots données pas trop volumineux et de vérifier l'écart de chacun des résultats afin de s'assurer que le résultat obtenu soit le plus juste possible.
\newpage
# Conclusion
Pour conclure, nous sommes parvenu à retrouvé la meilleure droite passant par un nuage de point aléatoire. Ce qui était l'objectif final ce travail. Ce qui veut dire que les étapes intermédiaire pour arriver à ce point sont fonctionnels, à savoir: **la minisation de la fonction de coup** et la **descente de gradient**. Nous avons également pu faire une partie analyse des résultats via l'**erreur quadratique** et on peut donc en déduire que les résultats trouvé sont plutôt satisfaisant.
Pour conclure, nous sommes parvenus à retrouver la meilleure droite passant par un nuage de point aléatoire en utilisant la régression linéaire et la méthode de la descente de gradient. Ce qui était l'objectif final ce travail. Ce qui veut dire que les étapes intermédiaires pour arriver à ce point sont fonctionnels, à savoir: **la minimisation de la fonction de coup** et la **descente de gradient**. Nous avons également pu faire une partie analyse des résultats via l'**erreur quadratique**.
En revanche, nous avons un soucis dans notre solution numérique. En effet, nous avons réussir à faire ce tp sur un nombre de point aléatoire inférieur à 40... Au dela, nous avons des résultats biaisé pour la descente de gradient. Par exemple: -nan; inf. Malheureusement nous ne sommes pas parvenu à savoir d'où provenait l'erreur et cela n'ou a empêché de faire cette étude sur un plus grand nombre de points.
En revanche, nous avons un soucis dans notre solution numérique. En effet, nous avons réussi à faire ce tp sur un nombre de point aléatoire inférieur à 40... Au-delà, nous avons des résultats biaisés pour la descente de gradient. Par exemple: -nan; inf. Malheureusement, nous ne sommes pas parvenus à savoir d'où provenait l(es)'erreur(s) et cela nous a empêché de faire cette étude sur un plus grand nombre de points.
# Remerciements
Nous tenions à remercier M. Malaspinas pour nous avoir donné un TP aussi agréable et constructif à réaliser et cela avec des technologies de pointe tel que le C. Un remerciement spécial aussi pour M. (l'assistant) qui est parvenu à répondre à nos questions de manière très pédagogique et ce en dévulgarissant le plus possible la problématique.
\ No newline at end of file
Nous tenions à remercier M. Malaspinas pour nous avoir donné un TP aussi agréable et constructif à réaliser et cela avec des technologies de pointe tel que le C. Un remerciement spécial aussi pour M. El Kharroubi qui est parvenu à répondre à nos questions de manière très pédagogique et ce, en dé-complexifiant le plus possible le sujet.
\ No newline at end of file
No preview for this file type
/**
* Author; Rivier Nicolas & Birner Scott
* Date: 12.12.2021
*/
#include "equation.h"
double get_random_between_0_and_1() {
......
/**
* Author; Rivier Nicolas & Birner Scott
* Date: 12.12.2021
*/
#ifndef _EQUATION_H
#define _EQUATION_H
#include <stdio.h>
......
/**
* Author; Rivier Nicolas & Birner Scott
* Date: 12.12.2021
*/
#include "group.h"
void create_group(group_t *group, point_t* points, int n_points, int n_groups) {
......
/**
* Author; Rivier Nicolas & Birner Scott
* Date: 12.12.2021
*/
#ifndef _GROUP_H
#define _GROUP_H
#include "equation.h"
......
/**
* Author; Rivier Nicolas & Birner Scott
* Date: 12.12.2021
* Description: main program of optimisation TP
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
......@@ -166,6 +171,10 @@ int main(int argc, char* argv[]) {
free(groupe_0_2);
free(groupe_1_2);
free(G0);
free(G1);
free(G2);
destroy_vector(&points_X);
destroy_vector(&points_Y);
destroy_vector(&droite_nuage_complet_A);
......
File moved
File moved
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment