Montant moyen du droit d'allocation chômage versé aux demandeurs d'emploi ind...
Mahout clustering
1. CLUSTERING SOUS
MAHOUT
Dr Mustapha MICHRAFY Dr Bernard KOUAKOU
Contact des auteurs :
datascience.km@gmail.com
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
2. Plan
• Présentation de Mahout
• Présentation du clustering
• Les algorithmes de clustering
• Clustering en ligne de commande
• API clustering
• Évaluation des clusters
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
3. Présentation de Mahout
• Objectif
• Caractéristique
• Compilation des sources
• Format et représentation de données
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
4. Présentation de Mahout
• Mahout : objectif
• Mahout est un API Java dédié aux algorithmes
d’apprentissage, à savoir:
Recommandation
Clustering
Classification
• Mahout supporte l’écosystème Hadoop
Les algorithmes sont programmés sous le paradigme
MapReduce
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
5. Mahout : caractéristique
• Mahout est un projet Apache, open source
• Il est évolutif (« scalable »)
• Portable ( API Java)
• Algorithmes en deux modes
Exécutable sous le framework hadoop
En séquentiel
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
6. Mahout : Compilation des sources
• Prérequis
Maven 2 et plus
Java 6
• Étapes de la compilation des sources
télécharger les sources de Mahout (Mahout-distribution-version-
src.zip)
dézipper le fichier téléchargé
aller à la racine du dossier Mahout
compiler les sources : mvn install
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
7. Mahout : Installation et configuration
• Prérequis
• Java
• Et Hadoop (pour les version mapreduce)
• Installation
télécharger Mahout (Mahout-distribution-version-src.zip)
dézipper le fichier téléchargé dans le dossier home/opt
• Configuration
• Ajouter le dossier Mahout dans le classpath
Ouvrir .bashrc
export Mahout_HOME=/home/opt/dossier_Mahout
export PATH=$PATH:$MAHOUT_HOME/bin
• Pointer sur Hadoop
Ouvrir le fichier bin/mahout et fixer la valeur de HADOOP_CONF_DIR
HADOOP_CONF_DIR=Home/Path_Hadoop
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
8. Présentation de mahout
• Format et représentation de données
• Sélection des caractéristiques et vectorisation :
Identifier un ensemble de caractéristiques pertinentes des objets à grouper ;
Attribuer des valeurs numériques aux caractéristiques retenues pour les
objets ;
Vectorisation : Représenter chaque objet par un vecteur en utilisant ces
valeurs numériques. Si n caractéristiques ont été retenues, alors un vecteur
de dimensions n est construit pour chaque objet.
• Mahout prend en entrée seulement les fichiers séquentiels
Écrire donc tous les vecteurs dans un même fichier de type «
SequenceFile ».
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
9. Présentation du clustering
• Objectif du Clustering
• Classement des méthodes de « Clustering »
• Critère de distinction des méthodes
• Qualité d’une méthode de clustering
• Similarité et dissimilarité
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
10. Présentation du clustering
• Clustering : objectif
• Il vise à répartir l'échantillon en groupes d'observations
homogènes.
• Chaque groupe est bien différencié des autres.
• Certaines méthodes visent à construire une hiérarchie, c-à-
d une suite de partitions « emboîtées », de plus en plus
fines, sur un ensemble d'observations (objets) initial. Cette
hiérarchie peut être résumée par un arbre hiérarchique.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
11. Présentation du clustering
• Classement des méthodes de « Clustering »
• Méthodes de type CAH
Ce sont les méthodes construisant une hiérarchie par agrégations
successives d’objets, puis de groupes, en fonction des distances entre objets
ou groupes.
• Méthodes de type CDH
Elles procèdent par dichotomie itérative : l’ensemble des éléments est divisé
en deux, puis chacune de ses parties est, à son tour subdivisée, et ainsi de
suite.
• Méthode de partitionnement
Elles visent à construire une partition de l’ensemble des données initiales
selon certains critères.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
12. Présentation du clustering
• Critère de distinction des méthodes (1)
• Trois points permettent de distinguer les méthodes.
• Point 1 : Le principe de construction des groupes
Procéder séquentiellement en regroupant les observations les
plus « semblables » en premier lieu ; c’est le principe des
méthodes hiérarchiques.
Ou regrouper simultanément en k groupes toutes les
observations. C’est le principe des méthodes non-
hiérarchiques.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
13. Présentation du clustering
• Critère de distinction des méthodes (2)
• Point 2 : Le critère de similarité/distance entre deux
observations/variables.
• Point 3 : Le critère de similarité/distance entre deux groupes ou entre
une observation et un groupe.
???
??? ???
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
14. Présentation du clustering
• Qualité d’une méthode de clustering (1)
• Une bonne méthode produit des clusters ayant :
une forte similarité intra‐classe ;
une faible similarité inter‐classe.
• La qualité d’un clustering dépend de la mesure de
similarité.
• La qualité d’une méthode peut aussi être mesurée par sa
capacité à identifier des motifs pertinents.
• En pratique, une fonction est utilisée pour la mesure de la
qualité.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
15. Présentation du clustering
• Qualité d’une méthode de clustering (2)
• la qualité des clusters est étroitement liée au :
1. Système de Pondération
Identifier les bonnes caractéristiques à prendre en compte ;
Donner un poids (une valeur numérique conséquente) à chacune
des caractéristiques. Les valeurs associées à une caractéristique
devront être cohérentes, pour l’ensemble des objets.
2. Choix de la Distance
Une bonne distance devra pouvoir mettre en lumière les objets
similaires et les affecter à un même cluster.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
16. Présentation du clustering
Distance Inter-clusters
x
y
(0,0)
Grande distance inter-cluster
x
y
(0,0)
petite distance inter-cluster
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
17. Présentation du clustering
Distance Intra-clusters
x
y
(0,0)
Grande distance intra-cluster
x
y
(0,0)
petite distance intra-cluster
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
18. Présentation du clutering
• Similarité et dissimilarité
• Une métrique de similarité/dissimilarité est exprimée par une
distance.
• La distance dépend du type des données : binaires,
nominales, ordinales ou continues.
• La pondération des dimensions selon l’application et la
sémantique des données.
• La notion de similarité est assez difficile à définir : la réponse
est très subjective.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
19. Algorithmes de clustering sous Mahout
• Mode d’utilisation des algorithmes
• Distances sous Mahout
• Schéma général des algorithmes
• Principe de l’Algorithme de Canopy
• Algorithme Canopy
• Algorithme K-means
• Algorithme Fuzzy K-means
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
20. Algorithmes de clustering sous Mahout
• Introduction
• Mahout propose plusieurs algorithmes de clustering dont :
• Canopy
• K-means
• Fuzy K-means
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
21. Algorithmes de clustering sous Mahout
• Mode d’utilisation des algorithmes
• Deux modes d’utilisation des algorithmes sous Mahout
1. Mode 1 : ligne de commande
2. Mode 2 : via l’API Mahout
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
22. Algorithmes de clustering sous Mahout
• Données fournies en Entrées des algorithmes
• Les vecteurs d’entrée (sous forme de SequenceFile)
• Les clusters initiaux ( sous forme de SequenceFile)
• La mesure de similarité (Distance)
• La précision pour la convergence
• Le nombre d’itérations
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
23. Algorithmes de clustering sous Mahout
• caractéristique d’une distance
• d(x,y) >= 0
• d(x,y) = 0 ssi x = y
• La symétrie : d(x,y) = d(y,x)
• Inégalité triangulaire : d(x,y) =< d(x,z) + d(z,y)
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
24. Algorithmes de clustering sous Mahout
• Distances proposées par Mahout
• Distance euclidienne d x, y ൌ ∑ ሺݔ െ ݕሻଶ
ୀଵ
• Squared Euclidean distance measure d x, y ൌ ∑ ሺݔ െ ݕሻଶ
ୀଵ
• Distance Manhattan d x, y ൌ ∑ ݔ െ ݕ
ୀଵ
• Cosine distance d x, y ൌ 1 െ
∑ ௫ ௬
సభ
∑ ௫
మ
సభ ∑ ௬
మ
సభ
൘
• DistanceTanimoto
d x, y ൌ 1 െ
∑ ݔݕ
ୀଵ
∑ ݔ
ଶ
ୀଵ ∑ ݕ
ଶ
ୀଵ െ ∑ ݔݕ
ୀଵ
൙
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
25. Algorithmes de clustering sous Mahout
Générer les vecteurs
via les données
Ecrire les vecteurs
dans un dossier
Ecrire les clusters
initiaux
Moteur de
clustering
Clusters générés
Schéma général des algorithmes
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
26. Algorithmes de clustering sous Mahout
• Algorithme de Canopy : principe
• C’est un algorithme de classification non supervisé.
• Il vise à construire un des canopy « qui peuvent se
chevaucher » d’une manière rapide.
• Il fait partie de la phase de prétraitement pour k-means ou
clustering hiérarchique.
• Il est essentiellement utilisé pour accélérer la mise en place
des grappes pour des instances de grande taille.
• Cet algorithme ne nécessite pas la spécification du nombre
de clusters.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
27. Algorithmes de Canopy
1. Entrée
• Ensemble des points E
• Distance d
• T1 et T2 deux seuils, T1 > T2
2. Sélectionner un élément x au hasard dans E.
3. Créer un canopy Cx en utilisant les y : d(x,y) < T1
4. Supprimer les y de E tels que d(x,y) < T2
5. Si E est non vide, aller à l’étape 2
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
28. K-means : caractéristiques
1. Il s’agit d’un algorithme de partitionnement.
2. L’objectif est de construire une partition à k clusters d’une
base de n objets
3. Chaque cluster est représenté par son centre (centroid)
4. Le nombre k de clusters est une entrée
5. Le codage des variables et la distance utilisée ont un
impact sur le résultat.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
29. Algorithme Kmeans
Entrée
• E, ensemble de points
• D, distance
• K, nombre de cluster
1. Choisir k objets Mi (i=1..k) formant ainsi k clusters ;
2. Affecter chaque objet O de E au cluster Ch de centre Mh
tel que d(O, Mh) est minimale ( d(O,Mh) <= d(O, Mi ),
i=1..k) ;
3. Recalculer Mi de chaque cluster (le barycentre) ;
4. Aller à l’étape 2 si on vient de faire une affectation (lors de
l’itération courante).
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
31. Algorithme Fuzzy K-means
Entrée
• ݊ points, ݔ ݅ ൌ 1. . ݊,
• ܿ nombre de clusters,
• ݉ le degré flou et ߝ le seuil de convergence
1- Choisir aléatoirement c centres ܥ ݆ ൌ 1. . ܿ
2- Initialiser la matrice ܷ : ݑ ൌ
ଵ
∑
ೣషೕ
ೣషೖ
మ
షభ
ೖసభ
3- À l’étape 3, actualiser d’abord ܥ et puis ܷ
ܿ ൌ
∑ ௨ೕ
௫
సభ
∑ ௨ೕ
సభ
݆ ൌ 1. . ܿ, ݁ݑ ݐ ൌ
ଵ
∑
ೣషೕ
ೣషೖ
మ
షభ
ೖసభ
݅ ൌ 1. . ݊, ݆ ൌ 1. . ܿ
4- Si max ݑ
ାଵ
െ ݑ
ߝ stop, sinon aller à l étape 3
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
32. Clustering en ligne de commande
• Algorithme canopy en ligne de commande
• Algorithme K-means en ligne de commande
• Algorithme FuzzyKemans en ligne de commande
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
33. Canopies en ligne de commande
• bin/mahout canopybin/mahout canopybin/mahout canopybin/mahout canopy
• i <input vectors directory>
• o <output working directory>
• dm <DistanceMeasure>
• t1 <T1 threshold>
• t2 <T2 threshold>
• t3 <optional reducer T1 threshold>
• t4 <optional reducer T2 threshold>
• cf <optional cluster filter size (default: 0)>
• ow <overwrite output directory if present>
• cl <run input vector clustering after computing Canopies>
• xm <execution method: sequential or mapreduce>
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
34. K-means en ligne de commande
• bin/mahout kmeans
• i <input vectors directory>
• c <input clusters directory>
• o <output working directory>
• k <optional number of initial clusters to sample from input vectors>
• dm <DistanceMeasure>
• x <maximum number of iterations>
• cd <optional convergence delta. Default is 0.5>
• ow <overwrite output directory if present>
• cl <run input vector clustering after computing Canopies>
• xm <execution method: sequential or mapreduce>
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
35. Fuzzy K-means en ligne de commande
bin/mahout fkmeans
• -i <input vectors directory>
• -c <input clusters directory>
• -o <output working directory>
• -dm <DistanceMeasure>
• -m <fuzziness argument >1>
• -x <maximum number of iterations>
• -k <optional number of initial clusters to sample from input vectors>
• -cd <optional convergence delta. Default is 0.5>
• -ow <overwrite output directory if present>
• -cl <run input vector clustering after computing Clusters>
• -e <emit vectors to most likely cluster during clustering>
• -t <threshold to use for clustering if -e is false>
• -xm <execution method: sequential or mapreduce>
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
36. API Clustering sous Mahout
• Le package Canopy
• Les packages relatifs à K-means
• Les packages relatifs à Fuzzy K-means
• L’arborescence des classes de type driver
• L’arborescence des classe de type cluster
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
37. A propos de l’API Clustering
• L’organisation des packages des algorithmes (canopy, k-
means, fuzzy k-means) est similaire.
• Chacun des trois algorithmes repose sur une classe driver
CanopyDriver pour l’algorithme canopy
KMeansDriver pour pour l’algorithme k-means
FuzzyKMeansDriver pour l’algorithme Fuzzy K-means
• La structure des trois classes drivers est similaire.
• Les classes drivers disposent des mêmes méthodes :
run, buildcluster, clusterData
• La description de l’API concerne la version 0.9 de Mahout.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
38. Package Canopy
• Package org.apache.mahout.clustering.canopy
Ce package présente les classes relatives à l’algorithme
canopy pour les modes séquentiel et parallèle (mapreduce).
• CanopyDriver
C’est la classe principale. C’est le point d’entrée de
l’algorithme.
Cette classe encapsule les étapes de l’algorithme canopy pour les
différents modes d’exécution.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
39. Package org.apache.mahout.clustering.canopy
• Les classes de ce package :
• CanopyDriver
• Canopy
• CanopyClusterer
• CanopyConfigKeys
• CanopyMapper
• CanopyReducer
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
40. La classe canopy
• Cette classe encapsule les données d’un canopy
• Elle étend la classe DistanceMeasureCluster
• DistanceMeasureCluster étend AbstractCluster
• AstractCluster implémente Cluster
• Constructeurs
public Canopy()
public Canopy(Vector center, int canopyId, DistanceMeasure measure)
• Services
Creer un canopy
Calculer le barycentre
Ajouter un point a un canopy
Et des getters et setters
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
41. Classe CanopyClusterer (1)
• Cette classe permet de gérer les canopy
• CanopyMapper, CanopyReducer et CanopyDrivers font
appel à cette classe.
• Constructeurs
public CanopyClusterer(DistanceMeasure measure, double t1, double t2)
public CanopyClusterer(Configuration config)
• Services
• addPointToCanopie ajoute un point aux canopy
public void addPointToCanopies(Vector, Collection<Canopy> )
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
42. Classe CanopyClusterer (2)
• canopyCovers teste si un point est couvert par un canopy
public boolean canopyCovers(Canopy, Vector)
• createCanopies crée des canopy en utilisant vecteurs et seuils
public static List<Canopy> createCanopies(List<Vector> points,
DistanceMeasure measure, double t1, double t2)
• getCenters retourne les barycentres des canopy
public static List<Vector> getCenters(Iterable<Canopy> canopies)
• updateCentroid actualise le barycentre de chaque canopy
public static void updateCentroids(Iterable<Canopy> canopies)
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
43. La classe CanopyConfigKeys
• C’est une classe finale.
• Elle ne comporte aucune méthode.
• Les attributs portent le qualificatif public static final.
• Elle encapsule l’ensemble des clés utilisées relatives au
seuil de canopy.
• Elle encapsule aussi la mesure de la distance.
• Elle dispose d’un constructeur sans arguments.
• Les attributs de cette classe sont utilisés par les classes
CanopyMapper, CanopyRudcer, CanopyDriver et
CanopyClusterer
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
44. Les classes CanapyMapper et CanopyReducer
• Les classes CanopyMapper et CanopyReducer sont utilisées
dans le mode parallèle pour construire les canopy.
• Elles sont appelées par la méthode buildClustersMR de la
classe CanopyDriver
• CanopyMapper redéfinit la méthode mapper() ainsi que stup()
et cleanup().
• CanopyReducer redéfinit les méthodes reducer() et stup()
• Les deux classes CanopyMapper et CanopyReducer font
appel aux classes Canoyp, CanopyClusterer et CanopyConfig
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
45. La classe CanopyDriver
• La classe principale qui gère les étapes de l’algorithme
• Elle étend AbstractJob
• Les deux principales méthodes sont
public static void run(…)
public static Path buildClusters(…)
• Les méthodes précédentes font appel à :
Algorithme séquentielAlgorithme séquentielAlgorithme séquentielAlgorithme séquentiel : private static Path buildClustersSeq(…)
Algorithme parallèleAlgorithme parallèleAlgorithme parallèleAlgorithme parallèle : private static Path buildClustersMR(…)
Calcul des points des clustersCalcul des points des clustersCalcul des points des clustersCalcul des points des clusters : private static void clusterData (…)
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
46. La classe CanopyDriver : séquence d’appel dans run(…)
1. Construire les clusters en appelant buildClusters(..)
a. Si runSequentiel = true alors
- Appeler la méthode séquentielle buildClustersSeq(…)
b. Sinon Appeler la méthode parallèle buildClustersMR()
2. Calculer des points de chaque clusters
a. Si runClustering = true alors
- Appeler la méthode clusterData()
b. Fin Si
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
47. Packages relatifs à l’algorithme K-means
• Deux principaux package regroupent les classes de
l’algorithme K-means :
org.apache.mahout.clustering.kmeans ;
org.apache.mahout.clustering.iterator.
• Le package org.apache.mahout.clustering.kmeans pilote les
différentes étapes de l’algorithme k means.
• Le package org.apache.mahout.clustering.iterator se charge de
l’implémentation des algorithmes séquentiel et parallèle de k
means.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
48. Package org.apache.mahout.clustering.kmeans
• Ce package est composé de plusieurs classes.
• La classe principale est KMeansDriver .
• C’est la classe KMeansDriver qui sera utilisée via l’API.
• Les classes de ce package sont :
Kluster : elle permet de créer un cluster. Elle étend
DistanceMeasureCluster
KMeansUtil : C’est une classe finale qui permet de créer une
liste de kluster.
KMeansConfigKeys : il dispose des clés qui seront utilisées
par la configuration relative à mapreduce
KMeansDriver : c’est la classe principale disposant des
méthodes qui seront exploitées via l’API pour l’algorithme K-
means
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
49. La classe KMeansDriver
• Cette classe dispose d’un ensemble de méthodes permettant la
mise en œuvre de l’algorithme K-means.
• La méthode principale est run(…)
• La méthode run à trois signatures différentes.
• Deux méthodes statiques et une public non statique.
1. Run1 : publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid runrunrunrun(Configuration conf, Path input, Path clustersIn, Path
output, double convergenceDelta, int maxIterations, boolean runClustering, double
clusterClassificationThreshold, boolean runSequential)
2. Run2 : publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid runrunrunrun(Path input, Path , Path double , int , boolean , double,
boolean )
3. Run3 : publicpublicpublicpublic intintintint runrunrunrun(String[] )
• Run2 crée une configuration et fait appel à Run1.
• Run3, utilisée via la ligne de commande, instancie les données et fait
appel à Run1.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
50. La classe KMeansDriver : la méthode run()
• La méthode Run1 fait appel à deux méthodes :
public static Path buildClusters(Configuration conf, Path input, Path clustersIn, Path
output, int maxIterations, String delta, boolean runSequential)
public static void clusterData(Configuration conf, Path input, Path clustersIn, Path
output, double clusterClassificationThreshold, boolean runSequential)
• Les arguments de la méthodes run()
input, clustersIn, output : les dossiers pour les vecteurs d’entrée, les clusters initiaux,
et le dossier de sortie. Les fichiers utilisés sont de type séquentiel (SequenceFile). Le
dossier de sortie de l’itération courante est utilisé comme entrée pour l’itération suivante
convergenceDelta : un nombre réel positif est utilisé pour la convergence.
clusterClassificationThreshold : il doit être dans [0,1], utilisé dans clusterData() pour
la constitution des points relatifs à chaque cluster.
maxIterations : le nombre maximum d’itérations fixé pour le calcul des clusters.
runSequential : il détermine le mode d’exécution ( séquentiel ou parallèle)
runClustering : si sa valeur est vraie, les points des clusters sont calculés et stockés
dans un dossier nommé clusteredPoints.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
51. Packages relatifs à l’algorithme Fuzzy K-means
• Deux principaux packages regroupent les classes de
l’algorithme Fuzzy K-means :
org.apache.mahout.clustering. fuzzykmeans
org.apache.mahout.clustering.iterator
• Le package org.apache.mahout.clustering. fuzzykmeans pilote
les différentes étapes de l’algorithme Fuzzy k means. Ce
dernier à une structure similaire à celle du package de K means.
• Le package org.apache.mahout.clustering.iterator se charge de
l’implemantation des algorithmes séquentiel et parallèle de
l’algorithme Fuzzy k means.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
52. Package org.apache.mahout.clustering.fuzzykmeans
• Ce package est composé de plusieurs classes dont la
principale est FuzzyKMeansDriver .
• Les classes de ce package sont :
SoftCluster : elle permet de créer un cluster. Elle étend Kluster.
FuzzyKMeansUtil : C’est une classe finale qui permet de créer
une liste de SoftCluster.
FuzzyKMeansClusterer : elle permet de calculer le degré
d’affinité d’un point par rapport à un cluster.
FuzzyKMeansConfigKeys : elle dispose d’une clé qui sera
utilisée par la configuration relative à mapreduce.
FuzzyKMeansDriver : c’est la classe principale disposant des
méthodes qui seront exploitées via l’API.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
53. La classe FuzzyKMeansDriver
• Cette classe dispose d’un ensemble de méthodes permettant la
mise en œuvre de l’algorithme Fuzzy K-Means.
• Cette classe est très similaire à la classe KmeansDriver.
• La méthode principale est run(…).
• La méthode run() à trois signatures différentes :
1. Run1 : publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid runrunrunrun(Configuration conf, Path input, Path clustersIn, Path
output, double convergenceDelta, int maxIterations, floatfloatfloatfloat mmmm, boolean runClustering,
booleanbooleanbooleanboolean emitMostLikelyemitMostLikelyemitMostLikelyemitMostLikely, double threshold,, boolean runSequential)
2. Run2 : publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid runrunrunrun(Path input, Path , Path, double , int, floatfloatfloatfloat ,,,, boolean ,
booleanbooleanbooleanboolean ,,,, double , boolean )
3. Run3 : publicpublicpublicpublic intintintint runrunrunrun(String[] )
• Run3 instancie les données et fait appel à Run1.
• la méthode Run3 est utilisée via la ligne de commande.
• Run2 ne dispose pas d’une configuration comme argument d’entrée.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
54. La classe FUZZYKMeansDriver
• Comme la méthode run() de la classe KmeansDriver, La méthode
run() fait appel à deux méthodes :
void buildClusters( …)
Void clusterData()
• Les arguments de la méthode run() :
float m : ce paramètre, spécifique à l’algorithme fuzzy k-means,
décrit le degré d’affinité.
boolean emitMostLikely : si sa valeur est « vraie », on associe le
cluster le plus probable à chaque point.
double threshold : il est utilisé si emitMostLikely est « false ». Il est
similaire à clusterClassificationThreshol utilisé dans la méthode run
de l’algorithme KmeansDriver.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
55. Arborescence de la classe de type « cluster »
DistanceMeasureCluster
Canopy
AbstractCluster
Object
<<Interface>>
cluster
org.apache.hadoop.util.Tool
Kluster
<<Interface>>
Model
bind<VectorWritable>
<<Interface>>
Parametered
Arborescence de la classe Canopy et Kluster
SoftCluster
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
56. Arborescence des classes de type Driver
org.apache.hadoop.util.Tool
AbstractJob
CanopyDriver
org.apache.hadoop.conf.Configured
Interface
org.apache.hadoop.util.Tool
KmeansDriver FuzzyKMeansDriver
SpectralKMeansDriver
Interface
org.apache.hadoop.conf.Configurable
Java.lang.Object
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
57. API Math de Mahout
• Interface vector
• Cette interface regroupe un ensemble d’opérations
relatives à un vecteur.
• Package : org.apache.mahout.math
• Interface Matrix
• Cette interface regroupe un ensemble d’opérations
relatives à une matrice.
• Package : org.apache.mahout.math
Les deux interfaces sont implémentées par plusieurs classes
(voir la doc).
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
58. API Math de Mahout
• Fichiers séquentiels
• Objectif : ecrire/lire une paire de key/value.
• Package : org.apache.hadoop.io.SequenceFile
• SequenceFile est un format Hadoop pour encoder une série de
clé-valeur.
• SequenceFile fournit deux classes internes : Writer et Reader
• La clé et la valeur doivent respectivement implémenter les
interfaces WritableComparable et Writable de hadoop.
• Les classes SequenceFile.Writer et SequenceFile.Reader sont
utilisées pour la génération des données sous forme d’un fichier
séquentiel ou la lecture des fichiers des clusters.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
59. API Math de Mahout
Fichiers séquentiels (Writer et Reader)
• La classe SequenceFile.Writer
SequenceFile.Writer(FileSystem, Configuration, Path,Class,Class) constructeurconstructeurconstructeurconstructeur
void append(Object key, Object val) ajouterajouterajouterajouter ((((kyekyekyekye,,,, valvalvalval) de type object) de type object) de type object) de type object.
void append(Writable key, Writable val) ajouterajouterajouterajouter un (key,un (key,un (key,un (key, valvalvalval))))
void close() fermerfermerfermerfermer lelelele fichierfichierfichierfichier
• La classe SequenceFile.Reader
SequenceFile.Reader(FileSystem, Path, Configuration) constructeurconstructeurconstructeurconstructeur
Class<?> getKeyClass() renvoyerrenvoyerrenvoyerrenvoyer lalalala classeclasseclasseclasse de lade lade lade la cléclécléclé
Class<?> getValueClass() renvoyer la classe de la valeurrenvoyer la classe de la valeurrenvoyer la classe de la valeurrenvoyer la classe de la valeur
boolean next(Writable key, Writable val) lire lalire lalire lalire la prochaineprochaineprochaineprochaine pair <key, value>pair <key, value>pair <key, value>pair <key, value>
void close() fermerfermerfermerfermer lelelele fichierfichierfichierfichier
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
60. API Math de Mahout
L’interface distance et ses Implémentations
• L’interface DistanceMeasure présente un ensemble de
services relatifs à une distance.
• Package : org.apache.mahout.common.distance
• Cette interface est implémentée par plusieurs classes dont :
• EuclideanDistanceMeasure : distance euclidienne 2 d
• SquaredEuclideanDistanceMeasure : distance euclidienne
• ManhattanDistanceMeasure : Distance de Manhattan
• CosineDistanceMeasure : distance cosinus
• TanimotoDistanceMeasure : distance de Tanimoto
• etc.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
61. Évaluation des clusterings
• Evaluation des algorithmes de clustering
• API Mahout pour l’affichage des clusters
• API Mahout pour l’évaluation des clusters
• Diagrammes et relation de dépendance
• Exécution en ligne de commande
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
62. Évaluation des algorithme de clustering
• Mahout propose des outils pour évaluer la qualité des
résultats obtenus par un algorithme de clustering.
• L’évaluation d’un clustering se fait à travers :
1. L’affichage et la visualisation des clusters générés ;
2. L’étude de la distance intra-clusters et inter-clusters.
• Trois packages sont dédiés à l’analyse et à l’évaluation des
clusters :
1. org.apache.mahout.utils.clustering
2. org.apache.mahout.clustering.evaluation
3. package org.apache.mahout.clustering.cdbw
• Ces 3 packages sont dans le module « integration » de la
version 0.9 de Mahout.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
63. Affichage et visualisation des clusters
• Le package org.apache.mahout.utils.clustering propose des
classes dédiées à l’affichage sous différents formats.
• La classe clé du package est ClusterDumper.
• ClusterDumper affiche les clusters selon le format spécifié.
• Elle supporte plusieurs formats :
TEXT, CSV, JSON, GRAPH_ML
• L’affichage par format est délégué à des classes du package.
• ClusterDumper est une classe finale et étend la classe
AbstractJob.
• ClusterDumper peut être utilisée via l’API Mahout ou en ligne de
commande en passant par bin/bin/bin/bin/mahoutmahoutmahoutmahout....
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
64. Formats d’affichage des clusters
• Plusieurs classes sont dédiées aux formats d’affichage.
• Ces classes implémentent la classe abstraite AbstractClusterWriterAbstractClusterWriterAbstractClusterWriterAbstractClusterWriter
• AbstractClusterWriterAbstractClusterWriterAbstractClusterWriterAbstractClusterWriter implémente l’interface ClusterWriterClusterWriterClusterWriterClusterWriter.
• ClusterWriterClusterWriterClusterWriterClusterWriter dispose d’une seule méthode writewritewritewrite avec 3 signatures
pour afficher une liste de clusters de type ClusterWritableClusterWritableClusterWritableClusterWritable.
• Mahout offre 4 implémentations de la classe AbstractClusterWriterAbstractClusterWriterAbstractClusterWriterAbstractClusterWriter :
1.1.1.1. ClusterDumperWriterClusterDumperWriterClusterDumperWriterClusterDumperWriter pour générer du format TEXTTEXTTEXTTEXT
2.2.2.2. CSVClusterWriterCSVClusterWriterCSVClusterWriterCSVClusterWriter pour générer du format CVSCVSCVSCVS
3.3.3.3. GraphMLClusterWriterGraphMLClusterWriterGraphMLClusterWriterGraphMLClusterWriter pour générer du format GraphMLGraphMLGraphMLGraphML
4.4.4.4. JsonClusterWriterJsonClusterWriterJsonClusterWriterJsonClusterWriter pour générer du format JSONJSONJSONJSON
• Le format se configure via la classe ClusterDumperClusterDumperClusterDumperClusterDumper avec la méthode
setOutputFormatsetOutputFormatsetOutputFormatsetOutputFormat (), option(), option(), option(), option of en ligne de commande.of en ligne de commande.of en ligne de commande.of en ligne de commande.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
65. La classe ClusterDumper
• ObjectifObjectifObjectifObjectif : Afficher et visualiser les clusters afin d’en apprécier la qualité.
• Elle transforme les résultats de type SequenceFile en un format lisible.
• Trois principales méthodesTrois principales méthodesTrois principales méthodesTrois principales méthodes
voidvoidvoidvoid printClustersprintClustersprintClustersprintClusters(String[](String[](String[](String[] dictionarydictionarydictionarydictionary)))) : pour afficher les clusters ;
publicpublicpublicpublic intintintint runrunrunrun(String[](String[](String[](String[] argsargsargsargs)))) : pour lancer l’affichage en ligne de
commande via bin/mahout. Cette méthode fait appel à printClustersprintClustersprintClustersprintClusters() ;() ;() ;() ;
voidvoidvoidvoid setOutputFormatsetOutputFormatsetOutputFormatsetOutputFormat(OUTPUT_FORMAT of(OUTPUT_FORMAT of(OUTPUT_FORMAT of(OUTPUT_FORMAT of)))) : pour fixer le format
d’affichage.
OUTPUT_FORMAT est un champs public, de type énumération de la classe
ClusterDumper, permettant de spécifier le format d’affichage.
• ConstructeursConstructeursConstructeursConstructeurs
public ClusterDumper(Path seqFileClusterIn, Path pointsClustered) ;
public ClusterDumper().
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
66. Densités Inter-clusters et Intra-clusters
• Pour un grand volume de données, il est impossible d’afficher et
d’observer les clusters.
• L’alternative est d’utiliser les distances Inter-clusters et Intra-
clusters mesurant resp. la séparation et la compacité des clusters
• Distance Inter-clusters vise à :
• évaluer la distance entre chaque paire de centroids ;
• mesurer l’éloignement/rapprochement des clusters.
• Distance Intra-clusters vise à :
• évaluer la distance entre chaque paire d’objets du même cluster ;
• mesurer le rapprochement des points au sein du même cluster ;
• exprimer la capacité de la mesure de similarité à retrouver et regrouper
des objets similaires.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
67. Distances Inter-clusters et Intra-clusters
• Mahout fournit 2 packages pour :
calculer les distances intra-cluster et inter-cluster ;
calculer et afficher les points des différents clusters.
• Les packages sont :
org.apache.mahout.clustering.evaluation ;
org.apache.mahout.clustering.cdbw.
• Les 3 principales classes sont :
RepresentativePointsDriverRepresentativePointsDriverRepresentativePointsDriverRepresentativePointsDriver : pour calculer et afficher les points des clusters ;
ClusterEvaluatorClusterEvaluatorClusterEvaluatorClusterEvaluator : pour calculer les distances intra/inter clusters ;
CDbwEvaluatorCDbwEvaluatorCDbwEvaluatorCDbwEvaluator : pour calculer densité intra/inter clusters à l’aide de la
méthode CDbw.
• En mode parallèle, la classe RepresentativePointsDriver fait appel aux
classes suivantes :
RepresentativePointsMapperRepresentativePointsMapperRepresentativePointsMapperRepresentativePointsMapper
RepresentativePointsReducerRepresentativePointsReducerRepresentativePointsReducerRepresentativePointsReducer
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
68. Classe RepresentativePointsDriver (1)
• Cette classe permet de créer et d’afficher les points par itération.
• Il s’agit d’une classe finale, qui étend la classe AbstractJobAbstractJobAbstractJobAbstractJob....
• Elle est aussi utilisée lors du calcul des densités intra-cluster par
les classes d’évaluation ClusterEvaluatorClusterEvaluatorClusterEvaluatorClusterEvaluator etetetet CDbwEvaluatorCDbwEvaluatorCDbwEvaluatorCDbwEvaluator....
• CetteCetteCetteCette classeclasseclasseclasse doitdoitdoitdoit etreetreetreetre appeléeappeléeappeléeappelée apresapresapresapres avoiravoiravoiravoir calculécalculécalculécalculé les clustersles clustersles clustersles clusters ainsiainsiainsiainsi quequequeque les points.les points.les points.les points.
• LesLesLesLes deuxdeuxdeuxdeux principalesprincipalesprincipalesprincipales méthodesméthodesméthodesméthodes de lade lade lade la classeclasseclasseclasse sontsontsontsont :
Run ()Run ()Run ()Run () : pour calculer les points à chaque itération
printRepresentativePoints (..) : pour afficher les points par itération en
utilisant les données générées par la méthode run().
L’argument runSequential de run() précise le mode d’exécution :
runSequential égal « true », pour le mode séquentiel ;
runSequentiel égal « false », pour le mode parallèle.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
69. Classe RepresentativePointsDriver (2)
• Ses méthodes « publics » sont des méthodes de classe (static).
• Notons aussi que la classe est finale et a d’un constructeur privé.
• Les méthodes « public » sont :
publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid runrunrunrun(Configuration(Configuration(Configuration(Configuration confconfconfconf,,,, PathPathPathPath clustersInclustersInclustersInclustersIn,,,, PathPathPathPath
clusteredPointsInclusteredPointsInclusteredPointsInclusteredPointsIn,,,, PathPathPathPath output,output,output,output, DistanceMeasureDistanceMeasureDistanceMeasureDistanceMeasure measuremeasuremeasuremeasure,,,, intintintint
numIterationsnumIterationsnumIterationsnumIterations,,,, booleanbooleanbooleanboolean runSequentialrunSequentialrunSequentialrunSequential) throws IOException,
InterruptedException : calculer les points/iteration
publicpublicpublicpublic intintintint run(String[]run(String[]run(String[]run(String[] argsargsargsargs)))) throws ClassNotFoundException,
IOException, InterruptedException : constituer les params et fait appel à
la methode run() precedente.
publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid printRepresentativePointsprintRepresentativePointsprintRepresentativePointsprintRepresentativePoints((((PathPathPathPath output,output,output,output, intintintint
numIterationsnumIterationsnumIterationsnumIterations)))) : afficher les points pour les iterations k ( k <
numIterations).
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
70. Formules des densités Inter/Intra-clusters
(pour la classe ClusterEvaluator )
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
71. La classe ClusterEvaluator
• Les méthodes sont :
• Map<Map<Map<Map<Integer,VectorInteger,VectorInteger,VectorInteger,Vector>>>> interClusterDistancesinterClusterDistancesinterClusterDistancesinterClusterDistances()()()()
Calculer la distance pour chaque paire de «centroids».
• doubledoubledoubledouble interClusterDensityinterClusterDensityinterClusterDensityinterClusterDensity()()()()
Calculer la densité inter clusters ;
Cette méthode fait appel à la méthode interClusterDistances() .
• publicpublicpublicpublic Map<Map<Map<Map<Integer,VectorInteger,VectorInteger,VectorInteger,Vector>>>> interClusterDistancesinterClusterDistancesinterClusterDistancesinterClusterDistances()()()()
Calculer la distance entre chaque paire de points du meme cluster.
• doubledoubledoubledouble intraClusterDensityintraClusterDensityintraClusterDensityintraClusterDensity()()()()
Calculer la densité intra cluster ;
Cette méthode fait appel à la méthode interClusterDistances().
• Deux Constructeurs
• publicpublicpublicpublic ClusterEvaluatorClusterEvaluatorClusterEvaluatorClusterEvaluator(Map<(Map<(Map<(Map<Integer,ListInteger,ListInteger,ListInteger,List<<<<VectorWritableVectorWritableVectorWritableVectorWritable>>,>>,>>,>>,
List<Cluster> ,List<Cluster> ,List<Cluster> ,List<Cluster> , DistanceMeasureDistanceMeasureDistanceMeasureDistanceMeasure))))
• ClusterEvaluatorClusterEvaluatorClusterEvaluatorClusterEvaluator(Configuration(Configuration(Configuration(Configuration confconfconfconf,,,, PathPathPathPath clustersInclustersInclustersInclustersIn))))
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
72. La classe CDbwEvaluator (1)
• Le calcul des densités s’appuyent sur la métrique CDBw (Compose
Density between and within clusters).
• CDbwEvaluator appartient au package
org.apache.mahout.clustering.cdbw.
• CDbw utilise un ensemble de points pour représenter le cluster (à
l’inverse des approches utilisant le centroid).
• La compacité des clusters est évaluée par la formule d’intra-cluster
density.
• La séparation des clusters est évaluée par une formule qui tient à la
fois compte des distances entre les clusters et l’intra-cluster density.
• La classe ClusterDumper fait appel aux méthodes de la classe
CDBwEvaluator pour l’évaluation des clusters.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
73. La classe CDbwEvaluator (2)
• Constructeurs
public CDbwEvaluator(Map<Integer,List<VectorWritable>>
representativePoints, List<Cluster> clusters, DistanceMeasure measure) ;
public CDbwEvaluator(Configuration conf, Path clustersIn).
• Les principales méthodes publics sont :
public doublepublic doublepublic doublepublic double intraClusterDensityintraClusterDensityintraClusterDensityintraClusterDensity()()()() : evalue le pourcentage de points
appartenant au voisinage des points choisis pour représenter les
clusters. L’objectif étant d’avoir une valeur élevée de cette densité.
publicpublicpublicpublic doubledoubledoubledouble interClusterDensityinterClusterDensityinterClusterDensityinterClusterDensity()()()() : evalue la densité moyenne des
points dans les zones situées entre les clusters. L’objectif étant d’avoir
la plus faible densité pour ces régions.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
74. La classe ClusterDumper et ses dépendances
AbstractClusterWriter
JsonClusterWriter
CvsClusterWriter
GraphClusterWriter
ClusterDumperWriter
Closeable
AbstractJob
ClusterDumper
<<Interface>>
ClusterWriter
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
75. Liens entre ClusterEvaluator, CDBwEvaluator,
ClsuterDumper et leurs dépendances
RepresentativePointsDriver
ClusterEvaluator
CDbwEvaluator
AbstractJob
RepresentativePointsMapper
RepresentativePointsReducer
ClusterDumper
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
76. Exécution en ligne de commande : ClusterDumper (1)
bin/mahout clusterdump
• input ( i) <input Path to job input directory>
• output ( o) < output file; if not specified, it prints the output to the
console.>
• outputFormat ( of) <outputFormat The optional output format for the
results. Options: TEXT, CSV, JSON or GRAPH_ML .>
• substring ( b) <substring The number of chars of the asFormatString()
to print>
• evaluate ( e) <Run ClusterEvaluator and CDbwEvaluator over the
input. The output will be appended to the rest of the output at the end. >
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
77. Exécution en ligne de commande : ClusterDumper (2)
• samplePoints ( sp) <samplePoints Specifies the maximum number of
points to include per cluster. The default is to include all points. >
• distanceMeasure ( dm) <distanceMeasure The classname of the
DistanceMeasure. Default is SquaredEuclidean >
• dictionary ( d) <The dictionary file that contains the reverse mapping
of integer ID to word.>
• dictionaryType ( dt) <dictionaryType The dictionary file type
(text|sequencefile); defaulted to ‘text’ .>
• numWords ( n) <The number of top terms to print, defaulted to 10>
• pointsDir ( p) <pointsDir The directory containing points sequence
files mapping input vectors to their cluster. If specified, then the program
will output the points associated with a cluster. >
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
78. ClusterDumper : exemples en ligne de commande
Exemple 1
bin/mahout clusterdump
-i <OUTPUT DIR>/output/clusters-10-final
-o <OUTPUT DIR>/output/clustersanalyze.txt
Exemple 2
• l’option –-evaluate permet de calculer les distances Inter et Intra-clusters
• bin/mahout clusterdump
-i <OUTPUT DIR>/output/clusters-10-final
-p <OUTPUT DIR>/output/clusteredPoints
-o /clusterPointsanalyze.txt
--evaluate
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
79. Les auteurs
• Mustapha MICHRAFY
• Bull/Fastconnect
• Bernard KOUAKOU
• CGI inc.
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com
Contact des auteurs :
datascience.km@gmail.com
80. Références
• Data Mining et statistique décisionnelle, Stéphane TUFFÉRY
• Mahout en Action, Sean Owen, Robin Anil, Ted Dunning, Ellen Friedman
• Site web de mahout : http://mahout.apache.org/
• Mahout 0.9 API : https://builds.apache.org/job/Mahout Quality/javadoc/
• Évaluation CDbw : http://www.db net.aueb.gr/files/HV_shortSETN02.pdf
• Mahout svn (vesrion 0.1 à 0.9) : http://svn.apache.org/repos/asf/mahout/tags/
• Mahout svn (version plus récente dans trunk) :
http://svn.apache.org/repos/asf/mahout/trunk/
Mustapha MICHRAFY & Bernard KOUAKOU datascience.km@gmail.com