import random as rd import numpy as np import matplotlib.pyplot as plt #----------outils de test et visualisation, dimension 2---------------- def creerDonnees(nbPts=500,nbCluster=5,sigma=0.03): """crée nbPts observations réparties dans nbCluster clusters de taille sigma - travail dans le plan""" #détermination de centres aléatoires pour les clusters centres=[[rd.random(),rd.random()] for i in range(nbCluster)] #création des observations, observations=[] groupe=[] for n in range(nbPts): #chacune est rattachée à un centre aléatoire numCentre=rd.randint(0,nbCluster-1) groupe.append(numCentre) posx,posy=centres[numCentre] #et située sur une gaussienne centrée en ce point x=rd.gauss(posx,sigma) y=rd.gauss(posy,sigma) observations.append([x,y]) return centres,observations,groupe def afficheCentres(points,symbole): X=[c[0] for c in points] Y=[c[1] for c in points] plt.plot(X,Y,symbole+"k") def afficheClasses(centres,observations,groupe): """affiche jusqu'à 0 nuages de points sur la fenêtre courante""" n=len(observations) plt.axis("equal") for i in range(len(centres)): X=[] Y=[] for k in range(n): if groupe[k]==i: X.append(observations[k][0]) Y.append(observations[k][1]) plt.plot(X,Y,".",color="C"+str(i)) afficheCentres(centres,"+") #création de données simulées centres,observations,groupe=creerDonnees() #------------programmation des k moyennes (dim quelconque)----- def distCarre(X1,X2): """carré de la distance euclidienne entre deux vecteurs de R^d""" pass def initialisationForgy(observations,k): #voir la documentation de rd.sample pass def association(observations,centres): pass def newCentres(observations,references,k): pass def kMoyAfficheEtapes(observations,k): plt.subplot(231) #initialiser la variable centres.............. plt.title("Départ") afficheClasses(centres,observations,groupe) for i in range(5): #Mise à jour................................ plt.subplot(232+i) plt.title("Etape "+str(i+1)) afficheClasses(centres,observations,references) plt.show() return references def listesIdentiques(l1,l2): pass def kMoy(observations,k,initialisation=initialisationForgy,affichage=True): #initialiser centres avec la fonction initialisation fournie if affichage: plt.subplot(121) plt.title("Départ") afficheClasses(centres,observations,groupe) #calculer la première association avant de lancer la boucle # puis la boucle...... if affichage: plt.subplot(122) plt.title("Résultat après "+str(i)+ "étapes") afficheClasses(centres,observations,references) return references #------mise en oeuvre, visualisation (d=2)--------- # affichage des étapes #reponse1=kMoyAfficheEtapes(observations,5) #algorithme des k-Moyennes #reponse2=kMoy(observations,5) #affichage final #plt.show()