Lycée Thers CORRIGÉ TP PYTHON - 09 L algorthme des k-meas pour partager u uage de pots e u ombre doé de classes peu dspersées 1 - La méthode de Forgy [Qu. 1] 1) Cette double somme comporte termes pusque chaque somme sur les P N k comporte card(n k ) termes. 2) Pour tout k, Mk P = M k G k + G k P. D où : M k P 2 = ( M k G k + G k P) 2 = (M k G 2 k + 2 M k G k. G k P + G k P 2 ) P N k P N k P N k = k M k G 2 k + 2 M k G k. Gk P + G k P 2 = k M k G 2 k + G k P 2 P N k P N k P N k } {{ } = 0 3) Doc, d après la questo précédete, I(M 1,..., M p ) = 1 p k M k G 2 k + 1 p G k P 2.e. k=1 k=1 P N k I(M 1,..., M p ) = 1 p k M k G 2 k + I(G 1,..., G p ). I(M 1,..., M p ) sera mmale lorsque la premère somme k=1 est ulle, sot lorsque M k = G k pour tout k. L algorthme. [Qu. 2] Par défto, s u pot du uage appartet à N (k) plus proche de A (k) Doc l appartet à C. que de A (k) j et pour tout j >, plus proche de A (k) alors pour tout j <, ce pot est strctemet que de A (k), vore à égale dstace. j Les esembles K,j (k) et H,j (k) sot des dem plas ouverts ou fermés. Il sot be covexes. Ue tersecto d esembles covexes état covexe, les C le sot auss. Motros qu l sot dsjots. Par l absurde, sot M C r C s avec r < s. O a alors M K r,s (k) et M H s,r (k).e. MA (k) r MA (k) s et MA (k) s < MA (k) r ce qu est mpossble. Les C sot doc 2 à 2 dsjots et covexes, A (k+1), l sobarycetre des pots apparteat à N (k) appartet à C, d où les A (k+1) sot dstcts 2 à 2.
CORRIGÉ TP PYTHON - 09 2 2 - L mplémetato de l algorthme [Qu. 3] O souhate revoyer le carré de la dstace de deux pots du pla : def dst2(p,q): retur (P[0]-Q[0])**2+(P[1]-Q[1])**2 [Qu. 4] O met e oeuvre l algorthme vu das le TP8 : def choxalea(x,y,p): =le(x) for rage(p): k= radt(,-1) # o permute les valeurs d dces k et tp=x[k],y[k]; X[k],Y[k]=X[],Y[]; X[],Y[]= tp retur X[:p],Y[:p] [Qu. 5] Ic pas de dffculté. O remarquera juste l astérsque qu précède le couple choxalea(x,y,p) permettat trasmettre à la focto scatter o pas ue varable, ce couple, mas deux varables, les deux composates de ce couple. Cela doe : def tnuagecetres(x,y,p, tallec): retur scatter(* choxalea(x,y,p),c=[( k/(p-1),(p-1-k)/(p-1),0,0.5) for k rage(p)], marker = *,s=p*[ tallec]) [Qu. 6] O retrouve c l algorthme classque de recherche d ue valeur mmale. O revoe le uméro du cetre qu est le plus proche du pot uméro k du uage, la focto mesurat cette proxmté état la focto dst2 : def plusprochecetre(ceters,k, cloud): # déterme l dce ( ppc) du cetre le plus proche du k- ème pot du uage et colore ce pot de la couleur du cetre et retoure l dce trouvé pt=cloud._offsets[k] # o colore le pot uméro k e or cloud._facecolors[k]=(0,0,0,0.5) # o dlate le pot uméro k cloud._szes[k]=cloud._szes[k]*3 cts= ceters._offsets # talsato du uméro du cetre le plus proche ppc=0 dm= dst2(pt,cts[0]) for rage(1, le(cts)): f dst2(pt,cts[]) <dm: ppc= dm= dst2(pt,cts[])
CORRIGÉ TP PYTHON - 09 3 pause (0.1) # o colore le pot uméro k avec la couleur du cetre le plus proche cloud._facecolors[k]= ceters._facecolors[ppc] # o red au pot uméro k sa talle d orge cloud._szes[k]=cloud._szes[k]//3 retur ppc [Qu. 7] O dot revoyer ue lste composée de p lstes, la -ème lste coteat les uméros des pots dot le cetre le plus proche est le cetre uméro. O utlse la focto précédete, das ue boucle, ce qu permet d examer tout les pots du uage et de détermer pour chacu le cetre assocé. Ue fos cette lste de lstes détermée, o met à jour la talle des cetres proportoellemet aux ombres de pots qu sot «proxmaux» de celu-c. def classes( ceters, cloud, tallec): # revoe la lste des classes, chaque classe état ue lste de uméro cls =[[] for k rage(p)] for k rage(): # la lste dot le uméro est égal au uméro du cetre assocé au pot uméro k est augmetée de la valeur k cls[ plusprochecetre( ceters,k, cloud)]. apped(k) # O met à jour les talles des cetres for k rage(le(cls)): f le(cls[k])!=0: ceters._szes[k]= tallec*le(cls[k]) retur cls [Qu. 8] 1) S l est ue lste de uméros de pots du uage cloud, o revoe le pot moye de ce sous uage sous la forme d u couple, abscsse moyee, ordoée moyee : def potmoye(l, cloud): pt=le(l) retur 1/ pt*sum([ cloud._offsets[k][0] for k l]),1/ pt *sum([ cloud._offsets[k][1] for k l]) 2) Pour obter u pot chos au hasard parm les pots du uage cloud et qu est pas das lstpts, o chost au hasard des uméros de pots de ce uage jusqu à avor chos u pot qu est pas das cette lste. O revoe alors ce pot. Volà ue soluto : def potalea(lstpts, cloud): test=true whle test:
CORRIGÉ TP PYTHON - 09 4 ewpt=cloud._offsets[radt(0,-1)] test= ewpt lstpts retur ewpt 3) A partr de la lste des classes, des uages cloud et ceters, o met à jour le tableau ceters e testat s le pot moye qu remplace u cetre est dfféret de ce cetre. S ue classe est vde, o chost u pot du uage qu est pas das la lste des cetres déjà costtuée. Cela peut se tradure as : def ouveauxct(cl, cloud, ceters, tallec): # revoe la lste des pots moyes des classes complétée par des pots du uage s le ombre de classes < p for k rage(p): l=le( cl[k]) test=false f l!=0: pm= potmoye( cl[k], cloud) test=test or tuple( ceters._offsets[k])!= pm ceters._offsets[k]= potmoye( cl[k], cloud) else: ceters._offsets[k]=potalea(ceters._offsets[:k ],cloud) ceters._szes[k]= tallec retur test [Qu. 9] Pour fr, o utlse ue boucle whle das laquelle o met à jour les classes, avec la codto d arrêt pour fr cette boucle : # les structos clf() uage = scatter(x,y,c=le(x)*[(1,1,1,0.5)],s=le(x)*[ tallept]) =le(x) cetres = tnuagecetres(x,y,p, tallect) pause(3) lesclasses = classes(cetres,uage, tallect) pause (0.5) whle ouveauxct( lesclasses,uage,cetres, tallect): pause (0.5) lesclasses = classes(cetres,uage, tallect) pause (0.1) La focto globale, kmeas clus toutes les déftos des foctos précédetes das l ordre des questos et comporte pour lge tale : def kmeas(x,y,p,tallept, tallect):
Le fcher du code se trouve c : tp9.py. O peut tester cette focto e exécutat les commades suvates : CORRIGÉ TP PYTHON - 09 5 kmeas([ radom()*200 for k rage(50)],[ radom()*200 for k rage(50)],5,80,120) ou kmeas([ radom()*300 for k rage(80)],[ radom()*300 for k rage(80)],7,80,120) Vous pouvez vor le résultat das les vdéos suvates : vdeo Kmeas 5-50 et vdeo Kmeas 7-80.