Projet “K
Transcription
Projet “K
Projet “K-Means” Ruggero G. Pensa 16 novembre 2006 1 Clustering Le principe du clustering est de diviser les données en plusieurs sous-ensembles. Comme le calcul de tous les sous-ensembles possibles n’est pas faisable, on utilise des heuristiques sous la forme d’optimisation itérative de la fonction objectif. Chaque algorithme possède un schéma de relocalisation qui réassigne itérativement les objets parmi les K classes. Dans la méthode du k-means, une classe est représentée par son centroı̈de, qui est une moyenne (souvent pondérée) des objets appartenant à cette classe. On considérera une matrice de données comme celle de la Table 1, où les valeurs de C variables (par exemples, des propriétés électriques), sont stockées pour un ensemble de L objets (par exemple, des matériaux). La case pij représente la valeur de la variable pj pour l’objet oi . Chaque objet oi peut être représenté comme un vecteur à C composantes (pi1 , . . . , piC ). On rappelle que, en langage C, si mat[L][C] est un tableau à deux dimension représentant la matrice de données, mat[i] est un tableau de taille C, et mat[i][j] contient la valeur de la j-ième composante du i-ième tableau. O|P o1 .. . oi .. . oL p1 p11 ... ... pj p1j ... ... pC p1C ... pi1 ... ... ... pij ... ... ... piC ... pL1 ... ... ... pLj ... ... ... pLC Tab. 1 – Un tableau de données à L lignes et C colonnes 1.1 La méthode K-Means L’algorithme des k-means, est de loin l’outil le plus populaire utilisé dans les applications scientifiques et industrielles de clustering. Le nom dérive du fait que, pour représenter chacune des K classes Ck , on utilise la moyenne (ou la moyenne pondérée) πk de ses points, appelée centroı̈de (ou centre de masse). Chacune des C composantes du vecteur πk est calculée par : 1 X pij πkj = |Ck | oi ∈Ck 1 Dans le cas de données numériques, cela donne un sens géométrique et statistique à la méthode. L’inertie intra-classe constitue le critère à optimiser. Elle est définie comme la moyenne des carrés des distances des objets de la classe au centre de gravité de celle-ci. On cherche ainsi à construire des classes compactes. L’inertie intra-classe associée à la classe Ck s’écrit formellement 1 X 2 Ik = d (oi , πk ) |Ck | oi ∈Ck L’objectif est alors de minimiser la somme de l’inertie intra-classe sur l’ensemble des classes. L’algorithme procède en deux étapes : dans la première phase, on réassigne tous les objets au centroı̈de le plus proche, et dans la deuxième phase, on recalcule les centroı̈des des classes qui ont été modifiées. Pour mesurer la proximité entre un centroı̈de et un objets, on calculera une distance entre ce deux vecteurs. On pourra utiliser, par exemple, la distance euclidienne, calculée de la manière suivante : v u C uX d(oi , πk ) = t (pij − πkj )2 j=1 Les deux phases sont itérativement répétées jusqu’à ce qu’un critère d’arrêt soit atteint (par exemple, si aucune modification n’a eu lieu, ou si le nombre maximum d’itérations a été atteint). Les principaux problèmes de l’approche des k-means comme des autres approches partitionnelles, sont l’influence de la partition initiale (qui est souvent choisie de façon aléatoire), et le choix du paramètre K qui n’est pas toujours évident. Soit P0 = {C1 , . . . , Ck , . . . , CK } répéter Affectation : générer une nouvelle partition en assignant chaque objet au groupe dont le centre de gravité est le plus proche Représentation : calculer les centres de gravité associés à la nouvelle partition jusqu’à convergence de l’algorithme vers une partition stable; Algorithm 1: K-means 1.2 Évaluation d’une partition Un critère général pour évaluer les résultats d’un clustering consiste à comparer la partition calculée avec une partition “correcte”. Cela signifie que les instances des données sont déjà associées à des étiquettes jugées correctes, et que l’on va pouvoir quantifier la conformité entre étiquettes calculées et étiquettes correctes. Une mesure classique est l’indice de Rand pour évaluer la conformité entre deux partitions de L éléments. Si C = {C1 . . . Cs } est la structure issue de la classification et que P = {P1 . . . Pt } est une partition prédéfinie, chaque paire de points peut être affectée au même cluster ou à deux clusters différents. Soit a le nombre de paires appartenant au même cluster de C et au même cluster de P. Soit b le nombre de 2 paires dont les points appartiennent à deux clusters différents de C et à deux clusters différents de P. La conformité entre C et P peut être estimée au moyen de la formule : a+b Rand(C, P) = L · (L − 1)/2 Cet indice prend des valeurs entre 0 et 1 et il est maximisé lorsque s = t. Nous utilisons l’indice de Rand pour calculer la précision dans nos expériences. 2 Description du projet Il s’agit ici de mettre en œuvre un vrai processus expérimentale pour tester l’efficacité d’un algorithme. Le processus est standard, et consiste à calculer l’indice de Rand pour un ensemble de jeu de données. L’initialisation de l’algorithme étant aléatoire, on mesurera la moyenne et l’écart-type des valeurs des indices de Rand pour un ensemble de 100 exécutions de l’algorithme. L’indice de Rand est calculé entre une partition exacte (c’est-à-dire, une partition validée par un expert) et la partition produite par l’algorithme. Une bonne partition devrait avoir un indice de Rand proche de 1. On peut affirmer que l’algorithme fonctionne bien, lorsque l’écart-type est petit par rapport à la moyenne. On pourra tester aussi d’autres types de paramètres, par exemple le nombre moyen d’itérations nécessaires à l’algorithme pour atteindre la stabilité. Le projet se déroule de la manière suivante : 1. Codage de l’algorithme : dans cette phase on se contentera de coder les fonction nécessaires au bon fonctionnement de l’algorithme. Une distance de type euclidien est suffisante. On pourra chercher sur le net ou dans un bouquin le pseudo-code de l’algorithme k-means. 2. Test de l’algorithme sur un petit jeu de données : on testera l’algorithme sur un petit jeu de données pour pouvoir déboguer le code. 3. Exécution du protocole de test : on exécutera le protocole standard pour mesurer les indices demandés. 4. Évaluation des résultats : on comparera les résultats sur les différents jeu de données. 5. Évaluation d’autres types de distances : on s’intéressera au codage de distances autres que la distances euclidienne (chercher, par exemple, l’algorithme “spherical k-means”. 6. Comparaison des résultats : dans quelle mesure la distance influence le comportement de l’algorithme ? 7. Complexité de l’algorithme : quelle est la complexité de l’algorithme k-means ? 2.1 Codage de l’algorithme Un certain nombre de fonctions a déjà été codé. Elles se trouvent dans l’archive kmeans.zip disponible sur ce site web : http ://eurise.univ-st-etienne.fr/~pensa/prog-L2-PCPA/Projet 3 Il faut télécharger l’archive est le décomprimer avec la commande : unzip kmeans.zip Un répertoire appelé kmeans sera créé. Dans ce répertoire il y le code source du projet. Il est ainsi structuré : – fichiers.c : fonctions pour l’ouverture des fichiers ; – fichiers.h : header de fichiers.c ; – outils.c : fonctions d’intérêt général (générateur de nombres aléatoires) ; – outils.h : header de outils.c ; – kmeans.c : fonctions de l’algorithme ; – kmeand.h : entête de l’algorithme ; – main.c : fonction main de l’algorithme k-means ; – rand.c : programme pour le calcul de l’indice de Rand. Pour – – – – 2.2 compiler il suffit d’utiliser la commande make : make all : pour tout compiler ; make kmeans : pour compiler l’algorithme k-means ; make rand : pour calculer le programme pour le calcul de l’indice de Rand ; make clean : pour nettoyer le répertoire (toujours conseillé lorsque l’on modifie un ou plusieurs fichiers). Exécution de l’algorithme Une fois le programme compilé, deux exécutables sont générés : – kmeans : pour exécuter l’algorithme k-means ; – rand : pour exécuter le programme pour le calcul de l’indice de Rand. Pour exécuter l’algorithme (par exemple sur le fichier test.txt avec K = 2) on utilisera la commande suivante : ./kmeans test.txt testres.txt 2 Le fichier testres.txt contiendra alors les étiquettes des classes pour chaque objet. Pour évaluer l’indice de Rand, on pourra utiliser la commande rand de la manière suivante : ./rand testres.txt testclass.txt 2.3 Exécution du protocole de test Dans le répertoire kmeans/test on trouvera les fichiers correspondant aux différents jeux de données. Les jeux de données sont les suivants : iris, glass, diabetes, ionosphere, heart, waveform. Pour chaque jeux de données on aura trois fichiers : – fichier jeudedonnees.txt contenant la matrice de données ; – fichier jeudedonnees number.txt contenant le nombre de classes à produire ; 4 – fichier jeudedonneesclass.txt contenant la partition “correcte” du jeu de données. Pour faciliter l’exécution sur les jeux de données de test, on pourra utiliser un certain nombre de scripts (contenus dans le répertoire kmeans). – tester.sh : pour exécuter un certain nombre de fois l’algorithme k-means sur un jeu de données ; – valider.sh : pour évaluer l’indice de Rand sur l’ensemble de résultats pour un jeu de données ; – lancer test.sh : pour lancer l’ensemble des tests. Par exemple, pour exécuter 100 fois l’algorithme k-means sur le jeu de données iris.txt avec K = 2, on utilisera la commande suivante : ./tester.sh iris 2 100 La commande crée d’abord un répertoire iris dans kmeans/test. Ensuite elle génère dans le répertoire kmeans/test/iris 100 fichiers nommés iris out i.txt (i = 1..100), contenant les 100 partitions et un fichier iris res.txt (dans le même répertoire) contenant, pour chaque exécution, ses statistiques. Pour évaluer l’indice de Rand sur les 100 résultats de l’algorithme k-means sur le jeu de données iris.txt, on utilisera la commande suivante : ./valider.sh iris 100 La commande génère un fichier iris rand.txt dans le répertoire kmeans/test/iris qui contient la valeur de l’indice de Rand pour chacune de 100 partitions produites. Pour tester l’algorithme sur l’ensemble de six jeux de données et pour en valider les résultats, il suffit de lancer la commande : ./lancer test.sh qui utilise les deux scripts précédents sur les six jeux de données. 3 Informations pratiques Le travail par groupes de deux personnes au maximum est fortement conseillé. Chaque groupe a à disposition quatre semaines pour terminer le projet. Les deux dernières séances de TP seront consacrées à la mise au point du projet. Il est fortement conseillé d’utiliser une bonne heure de la première séance pour comprendre le code et la structure de données, et pour chercher des exemples d’algorithme. Ensuite, il faut prévoir une heure dans la deuxième séance pour lancer les tests et récupérer les résultats. La date ultime pour la remise du dossier est le 22 décembre 2006. On n’acceptera que des dossiers en forme électronique, et ils devront contenir les parties suivantes : 5 – Les fichiers du projet. Le code doit être commenté. – Les fichiers des résultats. – Un compte rendu (3 pages max) en format électronique (Word, OpenOffice, LaTeX ou fichier texte). Pour comprimer le répertoire de travail dans un fichier .zip, on utilisera la commande suivante à partir du répertoire qui contient le répertoire kmeans : zip -r travail.zip kmeans. Le compte rendu doit contenir les information suivantes : – répartition des tâches ; – discussion des résultats ; – présentation des extensions (distances autres que la distance euclidienne, méthodes d’initialisation différentes, optimisations possibles...) ; – comparaison des résultats pour différentes distances ; – discussion sur la complexité de l’algorithme. Le dossier (fichier travail.zip + compte rendu) doit être envoyé à cette adresse e-mail : [email protected] en spécifiant les noms des participants au projet. Bon courage ! 6