clusteringHierarchiqueTemplate.py

Aller à la documentation de ce fichier.
00001 #-------------------------------------------------------------------------------
00002 print "Algorithme de clustering hierarchique"
00003 print "\t@version: 1.2  date: 26/06/2007 modified by Thomas Leaute"
00004 print "\t@version: 1.1  date: 25/05/2007 modified by Thomas Leaute"
00005 print "\t@version: 1.0  date: 05/03/2007 created by Thomas Leaute"
00006 print "\t@author: thomas.leaute _AT_ epfl.ch date: 09/05/2007"
00007 print "\t@copyright: EPFL-IC-IIF-LIA 2007"
00008 #-------------------------------------------------------------------------------
00009 ## @package clusteringHierarchiqueTemplate Algorithme de clustering hierarchique, par single-link et complete-link
00010 
00011 ## @file clusteringHierarchiqueTemplate.py Algorithme de clustering hierarchique, par single-link et complete-link
00012 
00013 execfile("distance.py")
00014 
00015 ## "single-link" ou "complete-link" 
00016 METHODE = "" 
00017 
00018 ## liste des noeuds de dendogramme restant a fusionner
00019 NOEUDS = [] 
00020 
00021 ##  \brief Cette classe represente un noeud dans un dendogramme de clusters
00022 class Noeud:
00023 
00024         ## @var profondeur 
00025         # \brief Profondeur du noeud dans le dendogramme
00026         
00027         ## @var successeurs 
00028         # \brief Liste des successeurs du noeud dans le dendogramme
00029         
00030         ## @var cluster 
00031         # \brief Cluster associe a ce noeud
00032         
00033         ## \brief Constructeur
00034         # @param self Reference vers l'objet
00035         # @param p Profondeur du noeud dans le dendogramme
00036         # @param succ Liste des successeurs du noeud
00037         # @param c Cluster associe a ce noeud. Si pas precise, construit le cluster comme l'union des clusters des successeurs
00038         def __init__ (self, p, succ, c = None):
00039                 self.profondeur = p
00040                 self.successeurs = succ
00041                 if c != None:
00042                         self.cluster = c
00043                 else:
00044                         self.cluster = [ donnee for noeud in self.successeurs for donnee in noeud.cluster ]
00045         
00046         ## \brief Affiche le dendogramme qui a ce noeud pour racine
00047         # @param self Reference vers l'objet
00048         # @param prefixe (optionnel) String a utiliser comme prefixe en debut de chaque ligne
00049         def afficheDentogramme (self, prefixe = ""):
00050                 print prefixe + str(self.cluster)
00051                 for i in range(0, len(self.successeurs)):
00052                         print prefixe + "|\n" + prefixe + "|"
00053                         trait = "---" + "".join(["---" for j in range(0, self.successeurs[i].profondeur - self.profondeur - 1)])
00054                         marge = "".join(["   " for j in range(0, self.successeurs[i].profondeur - self.profondeur - 1)])
00055                         if i == len(self.successeurs)-1:
00056                                 marge = "   " + marge
00057                         else:
00058                                 marge = "|  " + marge
00059                         print prefixe + trait
00060                         self.successeurs[i].afficheDentogramme(prefixe + marge)
00061                 
00062 
00063 ## \brief Initialise l'algorithme
00064 # 
00065 # Transforme les donnees en une liste de noeuds, chaque noeud correspondant a un cluster contenant une unique donnee
00066 # @param methode Methode utilisee ("complete-link" ou "single-link") 
00067 def chargeDonnees (methode):
00068         global NOEUDS, METHODE
00069         METHODE = methode
00070         print "a completer"
00071 
00072 
00073 ## \brief Retourne si tous les clusters ont ete fusionnes  
00074 # @return True si et seulement si \c NOEUDS ne contient plus qu'un seul noeud
00075 def fini ():
00076         print "a completer"
00077         
00078         
00079 ## \brief Distance entre deux clusters 
00080 # 
00081 # Consulte la valeur de \c METHODE pour decider de la methode de calcul de la distance
00082 # @param cluster1 Premier cluster
00083 # @param cluster2 Deuxieme cluster
00084 # @return La distance entre \c cluster1 et \c cluster2
00085 def distanceClusters (cluster1, cluster2):
00086         if METHODE == "single-link":
00087                 print "a completer"
00088         elif METHODE == "complete-link":
00089                 print "a completer"
00090         else:
00091                 print "Methode de calcul de la distance entre clusters '" + METHODE + "' inconnue"
00092                 return None
00093         
00094         
00095 ## \brief Fusionne les deux clusters les plus similaires dans la liste \c NOEUDS
00096 def reviseClusters ():
00097 
00098         # S'il y a strictement moins de 2 noeuds :
00099         if len(NOEUDS) <= 1:
00100                 return 
00101         
00102         # Sinon (plus de 2 noeuds), trouve les 2 noeuds dont les clusters sont les plus similaires :
00103         print "a completer"
00104                                 
00105         # Fusionne les deux clusters trouves pour former un nouveau noeud : 
00106         print "a completer"
00107                                 
00108 
00109 ## \brief Affiche le resultat du clustering, i.e. le dendogramme obtenu
00110 def afficheResultat (): 
00111         NOEUDS[0].afficheDentogramme()
00112 
00113 
00114 ############################
00115 
00116 # Charge la base de donnees :
00117 #execfile("maladies.py")
00118 execfile("profits.py")
00119 
00120 # Initialise l'algorithme de clustering hierarchique :
00121 chargeDonnees("single-link") 
00122 #chargeDonnees("complete-link") 
00123 
00124 # Lance l'agorithme de clustering :
00125 execfile("clustering.py")

Généré le Wed Jan 30 17:16:42 2008 pour Lab 9 : Clustering par  doxygen 1.5.2