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
typedefstruct_cluster{
struct_point*centroid;
intcolor;
}cluster;
typedefstruct_point{
floatx;
floaty;
char*label;// for tests
struct_cluster*cluster;
intcolor;
}point;
typedefstruct_kmeans{
intk;
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.