diff --git a/doc/screenshots/meilleure_droite.png b/doc/screenshots/meilleure_droite.png new file mode 100644 index 0000000000000000000000000000000000000000..6bea9a7f578c0a5f0a1297a43e82ccd9e4bd090f Binary files /dev/null and b/doc/screenshots/meilleure_droite.png differ diff --git a/doc/screenshots/nuage_aleatoire.png b/doc/screenshots/nuage_aleatoire.png new file mode 100644 index 0000000000000000000000000000000000000000..2a18849ffbc4706143ea32fdd583cbb740763be3 Binary files /dev/null and b/doc/screenshots/nuage_aleatoire.png differ diff --git a/doc/screenshots/optimisation_tableur.png b/doc/screenshots/optimisation_tableur.png new file mode 100644 index 0000000000000000000000000000000000000000..8d633e416db45edb1ee2f9bd121a4e349a44addf Binary files /dev/null and b/doc/screenshots/optimisation_tableur.png differ diff --git a/doc/screenshots/validation_croisee.png b/doc/screenshots/validation_croisee.png new file mode 100644 index 0000000000000000000000000000000000000000..9f29f94858ef0fc3f98691b7aab7773b36200c09 Binary files /dev/null and b/doc/screenshots/validation_croisee.png differ diff --git a/readme.md b/readme.md index 8649ee4add25f59e0a83387034a9b5c14cdc81a9..8f360ba1b1fa55951843994b7f8cf36e070c4664 100644 --- a/readme.md +++ b/readme.md @@ -6,39 +6,84 @@ tof: true lof: true --- \newpage -# Todo -- Equation de base: yj = c*xj+d+rj -- Créer un nuage de point autout de l'équation de base, le garder constant -- Descente du radiant - - Validation croisée: Séparer le nuage de point en 3 groupe -- Visualisation # Introduction Dans le cadre du cours de mathématiques en technologie de l’information nous avons pour mission de réaliser un travail pratique en C sur l'optimisation de fonction. -En effet, le but est de mettre en pratique les connaissances acquises en cours durant le premier semestre 2021 qui portait sur les fonctions, dérivées, minimum et maximum d'une fonction et optimisation de celles-ci. +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) sur un plan 2D. +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. -Ci-dessous un exemple du résultat attendu, à savoir, connaitre la meilleure droite passant par dans un nuage de points généré de manière aléatoire. +Ci-dessous un exemple du résultat attendu: {width=400px} -# Méthodes employée -## Solution analytique +# Solution analytique En premier lieux, nous avons cherchons à minimiser la fonction de coût: -E(a,b) = $\sum_{j=1}^n (a * x_{j} + b - y_{i})^2$ +E(a,b) = $\sum_{j=1}^N(a * x_{j} + b - y_{i})^2$ -En résolvant le système de deux équations à deux inconnues. +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. -## Solution numérique +Voici les equations obtenues en A et B: +## A +**Equation en A** +## B +**Equation en B** -# Résultats +## Passage par un tableur +Afin de s'assurer que les equations obtenues sont correct, nous avons réaliser les calculs dans un tableur. De cette façon, nous avons pu confirmer la qualité de nos calculs, mais aussi de s'avoir à quoi s'attendre en therme de résultat par la suite. + +Sur l'image suivante, les points représentent les points aléatoires et les trétillés représentent la meilleure droite. + + +À partir de ce moment là, on en a déduit que les équations obtenues en **A et B** sont correcte. + +# Solution numérique +## Génération des points pseudo aléatoire +Nous parlons de points pseudo aléatoire car, ils sont en réalité généré autour d'une fonction de droite tel que f() = ax+b avec une marge d'erreur en 0 et 1 sur l'axe y. + +{width=400px} + +En effet, de cette façon on s'assure que la droite que nous souhaitons retrouver resemble à celle qui a permis de générer les points... + +## Descente de gradient +Pour trouver la meilleure droite passant par le nuage de points, nous devont appliqué la descente de gradient. En effet, c'est cette formule qui nous permettra de retrouver l'ordonée à l'origine ainsi que la pente de la meilleur droite passant par un nuage de points. + +Sur notre nuage de points nous avons appliqué la formule suivante: +**Formule descente de gradient** + +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. + +Il a donc fallu en premier temps séparé de manière aléatoire notre nuage de points en 3 groupes distinct. Par la suite, le calcule de la descente du gradient et appliqué sur chacun des groupe. Le but de cette opération est de retrouvé dans chacun des groupes des droits similaires à celle trouvée au départ avec le nuage complet. Cela a pour but de valider nos données! + +{width=400px} + +## Erreur quadratique +L'erreur quadratique va nous donner un indice pour savoir à quel point nous somme précis dans le calcul de la descente de gradient. Plus la valeur de l'erreur quadratique est petite, mieux c'est. + +En voici la formule : +**Formule erreur quadratique** + +# Résultats +Comme nous avons pu le voir dans les figures précédentes, nous avons optenu des résultats concluent. 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. + +Voici un tableau des données obtenue sur une génération aléatoire ainsi que leur différence. + +| Nuage de 30 points | Descente de gradient | Différence | Erreur quadratique | +| :-- | :-- | :-- | :-- | +| Complet | 1.012865; 0.437018 | - | 3.774071 | +| Groupe 0 et 1 | 1.001448; 0.469333 | 0.011417; -0.032315 | 1.163377 | +| Groupe 0 et 2 | 1.001448; 0.469333 | 0.011417; -0.032315 | 1.163377 | +| Groupe 1 et 2 | 0.963636; 0.605260 | 0.049229; -0.168242 | 1.226093 | + +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. # Conclusion -# Remerciements \ No newline at end of file + +# Remerciements diff --git a/src/Python/plot_groups.py b/src/Python/plot_groups.py index b0fbf3ac463be6e23ed5ab3a3054d7e8aa4bc88f..01eb40aa7eb872735a84a09759e4a8f74b50ed6c 100644 --- a/src/Python/plot_groups.py +++ b/src/Python/plot_groups.py @@ -4,7 +4,7 @@ from load_vec import load_vector import numpy as np fig, (ax1, ax2, ax3) = plt.subplots(3) -fig.suptitle('Vertically stacked subplots') +fig.suptitle('Validation croisée') X_nuage_point = load_vector("../points_X.vec") Y_nuage_point = load_vector("../points_Y.vec") @@ -22,16 +22,18 @@ x = np.array(range(int(max(X_nuage_point))+1)) y = x * droite_nuage_0_1_A + droite_nuage_0_1_B ax1.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points") ax1.plot(x, y, label="Meilleure droite", color="red") +ax1.set_title("Groupe 0 et 1") x = np.array(range(int(max(X_nuage_point))+1)) y = x * droite_nuage_0_2_A + droite_nuage_0_2_B ax2.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points") ax2.plot(x, y, label="Meilleure droite", color="red") +ax2.set_title("Groupe 0 et 2") x = np.array(range(int(max(X_nuage_point))+1)) y = x * droite_nuage_1_2_A + droite_nuage_1_2_B ax3.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points") ax3.plot(x, y, label="Meilleure droite", color="red") +ax3.set_title("Groupe 1 et 2") - -plt.show() +plt.show() \ No newline at end of file diff --git a/src/droite_nuage_0_1_A.vec b/src/droite_nuage_0_1_A.vec index 633c9dede1dc05e81c2d97d9e07f278086b6852b..9d3993e974684069727bda7f202d66c771922bf8 100644 Binary files a/src/droite_nuage_0_1_A.vec and b/src/droite_nuage_0_1_A.vec differ diff --git a/src/droite_nuage_0_1_B.vec b/src/droite_nuage_0_1_B.vec index ffde9feab1659a3383dce10f9e96cfc341450c23..24ef5e38f28ed80ff63a6e2f762347f70e9638cc 100644 Binary files a/src/droite_nuage_0_1_B.vec and b/src/droite_nuage_0_1_B.vec differ diff --git a/src/droite_nuage_0_2_A.vec b/src/droite_nuage_0_2_A.vec index 633c9dede1dc05e81c2d97d9e07f278086b6852b..9d3993e974684069727bda7f202d66c771922bf8 100644 Binary files a/src/droite_nuage_0_2_A.vec and b/src/droite_nuage_0_2_A.vec differ diff --git a/src/droite_nuage_0_2_B.vec b/src/droite_nuage_0_2_B.vec index ffde9feab1659a3383dce10f9e96cfc341450c23..24ef5e38f28ed80ff63a6e2f762347f70e9638cc 100644 Binary files a/src/droite_nuage_0_2_B.vec and b/src/droite_nuage_0_2_B.vec differ diff --git a/src/droite_nuage_1_2_A.vec b/src/droite_nuage_1_2_A.vec index df9acc25cb4281b3d7a94d30102b122e9e335f01..5798fc18dd93f0c63befcde68cd655c40a824944 100644 Binary files a/src/droite_nuage_1_2_A.vec and b/src/droite_nuage_1_2_A.vec differ diff --git a/src/droite_nuage_1_2_B.vec b/src/droite_nuage_1_2_B.vec index 59a9014c6e8abca8f001faffe2517a8d0c8cd500..32fec07dc7bfeb6b525c4ca18b08a72a55cd7d7f 100644 Binary files a/src/droite_nuage_1_2_B.vec and b/src/droite_nuage_1_2_B.vec differ diff --git a/src/droite_nuage_complet_A.vec b/src/droite_nuage_complet_A.vec index d8f49ece08a9eaa1b3792313d20759bbabc4a7e7..6819862bcdd0381611cc0093cce893b75be28f58 100644 Binary files a/src/droite_nuage_complet_A.vec and b/src/droite_nuage_complet_A.vec differ diff --git a/src/droite_nuage_complet_B.vec b/src/droite_nuage_complet_B.vec index 6ef0b30b0bee7415acc2c087b7d8d7e8210f9edb..9165de064df0ac19e2f90d4d56b45cf114d207ac 100644 Binary files a/src/droite_nuage_complet_B.vec and b/src/droite_nuage_complet_B.vec differ diff --git a/src/points_X.vec b/src/points_X.vec index 52a86345c51e18e82764569f2a8243396b3060ac..54bc52036416ff8419aeb9743137fe6b5f2d446f 100644 Binary files a/src/points_X.vec and b/src/points_X.vec differ diff --git a/src/points_Y.vec b/src/points_Y.vec index 399d6972f133ffc25dfb7d2686e2ff68586c3b1d..380da97c6a5e6cdc189b3609f2a35ab157adb37d 100644 Binary files a/src/points_Y.vec and b/src/points_Y.vec differ