diff --git a/readme.md b/readme.md index cc3692109d639484cdf73418e3c3531d11837715..8135e0da5f42a51651c8dcf76510aecfa26264bb 100644 --- a/readme.md +++ b/readme.md @@ -1,12 +1,15 @@ % Programmation séquentielle - K-Means + # But Le but de ce travail est d'implémenter la méthode des k-moyennes pour partitionner des données de façon non supervisée. + # Théorie + ## Le partitionnement de données Le partitionnement de données (_clustering_) consiste à grouper des données @@ -18,12 +21,14 @@ On entendra "similarité" au sens de la fonction de calcul de similarité choisi  + ## Type des données Chaque point sera un vecteur de valeurs numériques à N dimensions. Ces valeurs seront des entiers dans un premier temps mais il est simple d'étendre les définitions aux types à virgule flottante. + ## Méthodes des k-moyennes La méthode k-moyennes (k-means en anglais) est un algorithme qui permet @@ -32,6 +37,7 @@ Ce processus de partitionnement s'effectue de manière non supervisée, c'est-à-dire que l'algorithme est appliqué sur des données non étiquetées et sans avoir recours à un retour externe sur les résultats. + ### Initialisation des clusters Une fois qu'on a défini le nombre de clusters souhaité (arbitrairement), @@ -41,9 +47,10 @@ Ces derniers peuvent être choisis en faisant recours à un degré variable d'aléatoire, selon les résultats souhaités. Il faut simplement s'assurer qu'ils ne soient pas trop proches les uns des autres. + ### Etapes -Ainsi, l'assignation des points à leurs _clusters_ se déroule de la manière suivante : +Ainsi, l'assignation des points à leurs _clusters_ se déroule de la manière suivante: Pour chaque point, il faut: @@ -65,27 +72,32 @@ Elles prennent en paramètre deux points et retournent un e valeur numérique. Une grande valeur de retour indiquera que les deux points sont éloignés. Inversément, une petite valeur de retour indiquera qu'ils sont proches. + ### Exemples Voici quelques exemples de fonctions de calcul de similarité. + #### Distance Euclidienne La distance euclidienne entre deux points $x$ et $y$ est définie par: -$$ \vec{D_e} = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2} = \sqrt{(x-y)^2} $$ +$$d(a, b) = \sqrt{\sum_{i = 1}^{n}(a_i - b_i)^2}$$ + #### Distance de Manhattan La distance de Manhattan ($D_m$) entre un point $x$ et $y$ correspond à : -$$ \vec{D_m} = |(x_1 - y_1)| + |(x_2 - y_2)| $$ -#### Distance circulaire +$$d(a, b) = \sum_{i = 1}^{n}|a_i - b_i|$$ +#### Distance circulaire + # Implémentation + ## Format d'entrée L'entrée sera un fichier spécifié en argument au programme. @@ -105,6 +117,7 @@ y1,y2,...,yn ... ``` + ## Format de sortie La sortie sera écrite dans un fichier spécifié en argument au programme. @@ -134,11 +147,11 @@ t1,t2,...,tn ## Interface utilisateur -Le programme fonctionnera entièrement en ligne de commande, avec possibilité -de spécifier un fichier d'entrée. À cette fin nous utiliserons des appels à -fscanf(...) et la lecture des arguments en ligne de commande. -Par défaut, le programme lira les données dans la console / sur -l'entrée standard (permet les "pipe"). +Le programme fonctionnera entièrement en ligne de commande. +Les formats d'entrée et de sortie ont été choisis pour être +"pipe-friendly", ce qui donne un degré de flexibilité supplémentaire +à l'utilisateur. + ## Déroulement de l'algorithme @@ -152,6 +165,7 @@ Une fois nos données correctement chargées, il faudra appliquer l'algorithme d ## Fonctions à implémenter + Votre programme doit implémenter les fonctions suivantes : - Définir _k_ centroïde aléatoirement - Calculer la distance entre le centre d'un centroïde et d'un point @@ -162,22 +176,29 @@ Votre programme doit implémenter les fonctions suivantes : ## 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. Étant donné que nous utilisons un algorithme non supervisé, il est difficile de vérifier si le résultat obtenu est "correct". Néanmoins, si nous appliquons notre algorithme sur des données dont on connaît le résultat attendu, alors il est possible de s'assurer que notre implémentation est correcte. Le fichier _data_for_tests.txt_ contient une dizaine de points directement assignés à un _cluster_. Vous devez vous assurer que votre implémentation des k-moyennes vous donne un résultat identique aux données de test. + # Travail à rendre -- Le repos git contenant le code réalisé. -- Vous devrez également présenter votre travail à l'aide d'un support (Powerpoint par exemple). + +- repo git contenant le code réalisé +- présentation du travail à l'aide d'un support (projection) +- démonstration du programme + # Travail suppémentaire possible + ## Affichage en temps réel 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 Étendre l'implémentation pour pouvoir utiliser des vecteurs