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