1+ # matrice de centroïde : k * n, où k = nombre de centroïdes demandés et n = ensemble de tous les mots (nombre de dimensions)
2+ # placer les centroïdes à des coordonnées identiques à des points sélectionnés au hasard à l'initialisation du clustering
3+ # calcul de la distance d'un mot par rapport à un centroïde dans la boucle : utiliser least-squares
4+ # trouver une façon pour que les points de données gardent en mémoire
5+ # il faut penser à inclure les stopwords pour le tp3
6+
7+ from dao import Dao
8+ import numpy as np
9+ import random
10+
11+ # méthode qui sera utilisée par le main/argparse
12+ def partionnement (bd :Dao ,taille :int ,k :int ):
13+ donnees_uniques ,liste_cooccurrences = bd .obtenir_donnees (taille )
14+ kmeans = KMeans (taille ,k ,liste_cooccurrences ,donnees_uniques )
15+ kmeans .equilibrer ()
16+
17+ class KMeans :
18+ def __init__ (self ,taille_fenetre :int ,k :int ,liste_cooccurrences :list ,donnees_uniques :dict ):
19+ self .__k = k
20+ self .__taille_fenetre = taille_fenetre
21+ self .__dimensions = len (donnees_uniques )
22+ self .__cooccurrences = self .__construire_matrice_cooccurrences (liste_cooccurrences )
23+ self .__centroides = self .__construire_matrice_centroides ()
24+ self .__clusters = {}# [index_mot][index_centroide], va servir à vérifier à chaque itération si des mots on changé de cluster
25+
26+ def __construire_matrice_cooccurrences (self ,liste_cooccurrences )-> np .array :
27+ matrice = np .zeros ((self .__dimensions ,self .__dimensions ))
28+ if len (liste_cooccurrences )> 0 :
29+ for point1 ,point2 ,score in liste_cooccurrences :
30+ matrice [point1 ,point2 ]= score
31+ return matrice
32+
33+ # on initialise les centroïdes à des coordoonées intelligentes
34+ # on prend celles de points de données au hasard
35+ def __construire_matrice_centroides (self )-> np .array :
36+ matrice = np .zeros ((self .__k ,self .__dimensions ))
37+ points_choisis = []
38+
39+ for centroide in range (self .__k ):
40+ while True :
41+ point = random .randrange (self .__dimensions )
42+ if point not in points_choisis :
43+ points_choisis .append (point )
44+ break
45+
46+ matrice [centroide ]= self .__cooccurrences [point ]
47+ return matrice
48+
49+ # méthode utiliser pour déterminer la distance d'un point de donnée par rapport à un centroide quelconque
50+ def __operation_moindre_carres (self ,vecteur_point ,vecteur_centroide :np .array )-> float :
51+ return np .sum ((vecteur_point - vecteur_centroide )** 2 )
52+
53+ # méthode qui s'occupera de trouver de manière itérative le point d'équilibre pour tous les centroïdes
54+ # lorsqu'aucun point de donnée n'a changé de cluster (le centroide),
55+ # on considère que l'équilibre a été trouvé et on cesse l'exécution de l'algo
56+ def equilibrer (self )-> None :
57+ print (self .__centroides )
58+ for centroide in self .__centroides :
59+ print (np .sum (centroide ))
60+
61+ def main ():
62+ bd = Dao ()
63+ bd .connecter ()
64+ bd .afficher ()
65+ partionnement (bd ,5 ,10 )
66+ bd .deconnecter ()
67+
68+ return 0
69+
70+ if __name__ == '__main__' :
71+ quit (main ())
72+