diff --git a/readme.md b/readme.md index cd6f9c1cdc6c8f48ec01df0964564b16e6739972..039c665d221a312eb4fa28f249f171326c9e621b 100644 --- a/readme.md +++ b/readme.md @@ -10,8 +10,7 @@ en _clusters_ de façon à ce que les éléments d'un même groupe soient proche uns des autres ou d'un élément virtuel représentant l'élément "moyen" de la partition. - - +](./img/kmeans_clustering.png) ## Méthodes des k-moyennes La méthode k-moyennes (k-means en anglais) est un algorithme qui permet de partitionner un groupe de données par rapport à une métrique définie. Chaque _cluster_ devra contenir des données homogènes. De plus tous les _cluster_ doivent également être hétérogènes les uns des autres. @@ -19,21 +18,24 @@ La méthode k-moyennes (k-means en anglais) est un algorithme qui permet de part Ce processus de regroupement de données s'effectue de manière non supervisée, c'est-à-dire que l'algorithme utilisé s'applique sur des données non étiquetées et sans avoir recours à un retour externe sur ses résultats. ## Initialisation des clusters -Avant de pouvoir appliquer l'algorithme des k-moyennes, il faut déterminer le nombre de _clusters_ souhaité ($k$) ainsi que la position de leur _centroïde_ (point représentant le centre de chaque _cluster_). +Avant de pouvoir appliquer l'algorithme des k-moyennes, il faut déterminer le nombre de _clusters_ souhaité ($k$) ainsi que la position de leur _centroïde_, point représentant le centre de gravité de chaque _cluster_. Le _centroïde_ n'est pas forcément au centre du cluster. -Dans un premier temps la valeur de $k$ peut être choisie arbitrairement, mais il faudra par la suite déterminer la valeur la plus optimale (nous y reviendrons plus tard). +Le $k$ choisi sera fixe pour le partionnement mais pourra être modifié par la suite par une valeur plus optimisée (voir la section calcul du $k$ optimal). La position des _centroïdes_ sera déterminée aléatoirement mais il faut s'assurer qu'ils ne soient pas trop proches les uns des autres afin d'avoir des _clusters_ cohérents. Vous devrez déterminer une distance $\delta$ minimale séparant chaque _centroïde_ entre eux. -## Calcul de la distance -Vous travaillerez avec des points à 2 dimensions contenant des coordonnées sous la forme de nombres à virgule flotante. Ainsi vous devrez les assigner à des _clusters_ par rapport à la distance séparent les points. En effet, chaque point devra appartenir au _cluster_ dont son _centroïde_ est le plus proche. +## Données d'entrée et métrique +Vous travaillerez avec des points à $n$ dimensions contenant des valeurs numériques (vous êtes libres de choisir le type). +La métrique utilisée pour le partionnement des données est libre. Les sections ci-dessous donnent quelques détails si vous décidez d'effectuer un partionnement selon la distance des points. + +## Calcul de la distance +Un partitionnement des données selon leur distance pourrait, par exemple, assigner les points aux _clusters_ par rapport à la distance les séparants. En effet, chaque point pourrait appartenir au _cluster_ dont son _centroïde_ est le plus proche. Afin de quantifier la proximité de deux éléments entre eux, nous avons besoin de définir une fonction distance, qui sera notre métrique. -Cette fonction distance peut retourner simplement une distance -de Manhattan ou une distance euclidienne et prend en argument deux vecteurs éléments de notre univers. +Vous êtes libre de choisir la manière de calculer la distance, vous pourriez par exemple utiliser une distance de Manhattan ou une distance euclidienne. $$d(x,y)$$ @@ -67,13 +69,14 @@ Pour cela il existe de nombreuses méthodes, les plus connues étant : - L'analyse par silhouette (Silhouette analysis) # Énoncé -À partir d'un fichier contenant des points à 2 dimensions (chaque coordonnées étant un nombre à virgule flotante), vous devez implémenter l'algorithme k-moyennes et permettre la visualisation des différents clusters créés. +À partir d'un fichier contenant des données de $n$ dimensios, vous devez implémenter l'algorithme k-moyennes et permettre la visualisation des différents clusters créés. Cet algorithme peut s'appliquer facilement à tous types de données pouvant être représentées sous forme de vecteurs de valeurs. -Cependant, nous avons décidé de limiter ce travail aux vecteurs à valeurs -décimales, en 2 dimensions, pour en simplifier la visualisation -et la vérification de notre algorithme. + +Dans un premier temps vous devez définir manuellement le $k$ utilisé, mais il faudra déterminer le $k$ optimal une fois votre implémentation terminée. + +Vous retournerez le résultat de votre algorithme selon le format défini en annexe. ## Interface utilisateur @@ -92,9 +95,6 @@ Une fois nos données correctement chargées, il faudra appliquer l'algorithme d 2. Déterminer les points appartenant à chaque _cluster_ selon leur distance avec les _centroïdes_. 3. Une fois tous les points (ré)assignés à un _cluster_, calculer la nouvelle position des _centroïdes_ (il s'agira du nouveau centre du _cluster_ suite à la modification des points). 4. Recommencer à partir de l'étape 2 si la position d'au moins 1 _centroïde_ a été modifiée. -5. Afficher les points et _clusters_ à l'écran (avec des couleurs !) - -Il faudra utiliser la librairie gfx pour afficher vos résultats. ## Fonctions à implémenter Votre programme doit implémenter les fonctions suivantes : @@ -105,28 +105,7 @@ Votre programme doit implémenter les fonctions suivantes : - Déterminer les points appartenant aux _clusters_ - Déterminer le K optimal (Elbow optimal, silhouette method, ...) -Ainsi que les structures ci-dessous : - -```c -typedef struct _cluster { - struct _point* centroid; - int color; -} cluster; - -typedef struct _point { - float x; - float y; - char* label; // for tests - struct _cluster* cluster; - int color; -} point; - -typedef struct _kmeans { - int k; - struct _cluster* clusters_array; // k size - struct _point** points_array; -} kmeans; -``` +Vous devrez probablement implémenter des structures représentant les _clusters_ et les points. ## Vérification du travail réalisé Afin de s'assurer que votre algorithme a été correctement implémenté vous devez mettre en place des fichiers de tests. @@ -145,9 +124,12 @@ Le fichier _data_for_tests.txt_ contient une dizaine de points directement assig Au lieu d'afficher directement le résultat final de votre implémentation de l'algorithme des k-moyennes, vous devez afficher chaque étape effectuée afin que l'on puisse constater comment l'assignation des points aux _clusters_ est effectuée. -## Implémentation avec vecteurs à $n$ dimensions +# Références + +- [https://www.editions-eni.fr/livre/le-machine-learning-avec-python-de-la-theorie-a-la-pratique-9782409031816/extrait-du-livre.pdf](https://www.editions-eni.fr/livre/le-machine-learning-avec-python-de-la-theorie-a-la-pratique-9782409031816/extrait-du-livre.pdf) + +- [https://towardsdatascience.com/k-means-clustering-algorithm-applications-evaluation-methods-and-drawbacks-aa03e644b48a](https://towardsdatascience.com/k-means-clustering-algorithm-applications-evaluation-methods-and-drawbacks-aa03e644b48a) -Étendre l'implémentation pour pouvoir utiliser des vecteurs -à $n$ dimensions avec $n$ passé en paramètre au début de la procédure. +- [https://towardsmachinelearning.org/k-means/](https://towardsmachinelearning.org/k-means/) -Afin de pouvoir visualiser les résultats, vous devrez également implémenter l'algorithme PCA pour la visualisation de vecteurs à plus de 2 dimensions. +- [https://vitalflux.com/elbow-method-silhouette-score-which-better/](https://vitalflux.com/elbow-method-silhouette-score-which-better/)