diff --git a/kmeans.md b/kmeans.md index f09cb6bc94473a9be0a6dc08db5ff03be608fdc3..c8e060536456b05bae78cecb48f1edd4292478f7 100644 --- a/kmeans.md +++ b/kmeans.md @@ -1,5 +1,5 @@ --- -title: K-Means +title: Programmation séquentielle - K-Means author: - GENGA Dario - JAQUET Steven @@ -16,34 +16,27 @@ header-includes: - \renewenvironment{figure}[1][2] {\expandafter\origfigure\expandafter[H]} {\endorigfigure} --- -# Introduction: partitionnement de données +# Buts +- Le but de ce travail pratique est d'implémenter la méthode des k-moyennes pour +partitionner des données de façon non supervisée. +# Le partitionnement de données De façon générale, le partitionnement de données consiste à grouper des données en clusters de façon à ce que les éléments d'un même groupe soient proches les -uns des autres ou d'un élément virtuel représentant l'élément "moyen" de -la partition. +uns des autres ou d'un élément virtuel représentant l'élément "moyen" de la +partition. -# Méthode des k-moyennes (k-means) +# Méthodes des k-moyennes +Dans ce travail vous devrez implémenter l'algorithme k-moyennes (k-means en anglais) +qui permet de partionner un groupe de données par rapport à une metrique définie. +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. -La méthode des k-moyennes est un algortihme permettant de partitionner -un ensemble de données par rapport à une métrique prédéfinie. -## Données - -Les éléments de l'univers doivent être représentables sous forme -de vecteurs de valeurs -naturelles (éléments de $\mathbb{N}^n$) -ou réelles (éléments de $\mathbb{R}^n$) . - -## Fonctions à faire -- definir centroide aleatoirement (3) -- calcul dst euclidienne centre - pt -- calcul de la moyenne -- lire le fichier -- place les closteur (ou et nombre) +# Énoncé +À partir d'un fichier contenant des points à 2 dimensions, implémenter l'algorithme k-moyennes et visualiser les différents clusters créés. ## Fonction distance - 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. @@ -57,35 +50,34 @@ $$d(x,y)$$ Une grande valeur de retour indiquera que $x$ et $y$ sont éloignés. Inversément, une petite valeur de retour indiquera qu'ils sont proches. -## Algorithme - -### distance euclidienne +## Distance euclidienne - calculer la distance entre un point a l'aide de la dst euclidienne et les centroides : sqrt((x2-x1)^2 + (y2-y1)^2) = sqrt((x-y)^2) - comparer les dst qui séparent le point aux centroides - assigner le point au centroide le plus proche - faire ca pour tous les points -### distance de Manhattan +## Distance de Manhattan - calculer la distance entre un point a l'aide de la dst euclidienne et les centroides : |(x2 - x1)| + |(y2-y1)| - comparer les dst qui séparent le point aux centroides - assigner le point au centroide le plus proche - faire ca pour tous les points -# Implémentation - -## Type de données -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 nos tests aux vecteurs à valeurs -naturelles, en 2 dimensions, pour en simplifier la visualisation -et la vérification de notre algorithme. +## Fonctions à implémenter +Votre programme doit implémenter les fonctions suivantes : +- Définir _k_ centroide aleatoirement +- Calculer la distance euclidienne entre le centre d'un centroide et d'un point +- Calculer la nouvelle position d'un centroide (à partir de la moyenne des points) +- Lire un fichier contenant des points +- Déterminer les points appartenant aux closters +- Déterminer le K optimal (Elbow optimal, silhouette method, ...) -$$v \in \mathbb{N}^2$$ +Ainsi que les structures ci-dessous : -### structure de donnée +```c typedef struct _cluster { point* centroid; + int color; } cluster; typedef struct _point { @@ -102,16 +94,7 @@ typedef struct _kmeans { cluster clusters_array[k]; point** points_array; } kmeans; - -**BONUS 1** : étendre l'implémentation pour pouvoir utiliser des vecteurs -à $n$ dimensions avec $n$ passé en paramètre au début de la procédure. - -**BONUS 2** : implémentation de l'algorithme PCA pour la visualisation -de vecteurs à plus de 2 dimensions. - -## Algorithme - -**A FAIRE** +``` ### centroides - placer des centroides aléatoirement @@ -120,6 +103,26 @@ de vecteurs à plus de 2 dimensions. - changer les cordonnées des centroides - répeter les actions jusqu'à que les cordonnées du centroides ne change pas + +## Type de données + +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 nos tests aux vecteurs à valeurs +naturelles, en 2 dimensions, pour en simplifier la visualisation +et la vérification de notre algorithme. + +$$v \in \mathbb{N}^2$$ + +# Bonus + +**BONUS 1** : étendre l'implémentation pour pouvoir utiliser des vecteurs +à $n$ dimensions avec $n$ passé en paramètre au début de la procédure. + +**BONUS 2** : implémentation de l'algorithme PCA pour la visualisation +de vecteurs à plus de 2 dimensions. + + ## Interface utilisateur Le programme fonctionnera entièrement en ligne de commande, avec possibilité