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

advance on documentation

parent 74304955
No related branches found
No related tags found
No related merge requests found
doc/screenshots/meilleure_droite.png

20.6 KiB

doc/screenshots/nuage_aleatoire.png

12.6 KiB

doc/screenshots/optimisation_tableur.png

39.2 KiB

doc/screenshots/validation_croisee.png

41.1 KiB

...@@ -6,39 +6,84 @@ tof: true ...@@ -6,39 +6,84 @@ tof: true
lof: true lof: true
--- ---
\newpage \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 # 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. 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:
![Exemple ](./doc/screenshots/exemple.png){width=400px} ![Exemple ](./doc/screenshots/exemple.png){width=400px}
# Méthodes employée # Solution analytique
## Solution analytique
En premier lieux, nous avons cherchons à minimiser la fonction de coût: 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.
![Résultat par un tableur](./doc/screenshots/optimisation_tableur.png)
À 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.
![Nuage de points pseudo aléatoire](./doc/screenshots/nuage_aleatoire.png){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 ## 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!
![Validation croisée, descente de gradient](./doc/screenshots/validation_croisee.png){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 # Conclusion
# Remerciements # Remerciements
...@@ -4,7 +4,7 @@ from load_vec import load_vector ...@@ -4,7 +4,7 @@ from load_vec import load_vector
import numpy as np import numpy as np
fig, (ax1, ax2, ax3) = plt.subplots(3) 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") X_nuage_point = load_vector("../points_X.vec")
Y_nuage_point = load_vector("../points_Y.vec") Y_nuage_point = load_vector("../points_Y.vec")
...@@ -22,16 +22,18 @@ x = np.array(range(int(max(X_nuage_point))+1)) ...@@ -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 y = x * droite_nuage_0_1_A + droite_nuage_0_1_B
ax1.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points") ax1.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points")
ax1.plot(x, y, label="Meilleure droite", color="red") 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)) x = np.array(range(int(max(X_nuage_point))+1))
y = x * droite_nuage_0_2_A + droite_nuage_0_2_B y = x * droite_nuage_0_2_A + droite_nuage_0_2_B
ax2.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points") ax2.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points")
ax2.plot(x, y, label="Meilleure droite", color="red") 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)) x = np.array(range(int(max(X_nuage_point))+1))
y = x * droite_nuage_1_2_A + droite_nuage_1_2_B y = x * droite_nuage_1_2_A + droite_nuage_1_2_B
ax3.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points") ax3.scatter(X_nuage_point, Y_nuage_point, marker='.', label="Points")
ax3.plot(x, y, label="Meilleure droite", color="red") 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
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
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