002| import csv 003| file=open('D:/IA/BostonHouses.csv','r') 004| R = csv.reader(file,delimiter=';') 005| data=[] 006| for e in R: 007| T=[] 008| for i in range(len(e)-1) : 009| T.append(float(e[i])) 010| data.append(T) 011| 012| print(data) 013| 014| ## Fonction de calcul de distance euclidiènne 015| def distance(X,Y): 016| s=0 017| for i in range(len(X)): 018| s=s+(X[i]-Y[i])**2 019| return s**0.5 020| 021| print(distance(data[0],data[1])) 022| 023| ## Choix alétoire de k centroides 024| from random import randint 025| def centroides_depart(data,k): 026| C=[] 027| while len(C)<k: 028| i=randint(0,len(data)-1) 029| if data[i] not in C: C.append(data[i]) 030| return C 031| 032| C=centroides_depart(data,3) 033| print(C) 034| 035| ## Recherche du centroide le plus proche à une maison 036| def centroide_proche(m,C): 037| i,d=0,distance(m,C[0]) 038| for j in range(1,len(C)): 039| r=distance(m,C[j]) 040| if r<d: i,d=j,r 041| return i 042| 043| print(centroide_proche(data[0],C)) 044| print(centroide_proche(data[100],C)) 045| 046| ## Partitionnement des maisons en groupes (cluster) 1 047| def partitions(data,C): 048| k=len(C) 049| D={i:[] for i in range(k)} 050| for i in range(len(data)): 051| p=centroide_proche(data[i],C) 052| D[p].append(data[i]) 053| return D 054| 055| D=partitions(data,C) 056| print(D[0]) 057| 058| ## Calcul du nouveau centroide d'un cluster L 059| def calcul_centroide(L): 060| n=len(L) 061| p=len(L[0]) 062| c=[0]*p 063| for m in L: 064| for j in range(p): 065| c[j]=c[j]+m[j] 066| for j in range(p): 067| c[j]=round(c[j]/n,2) 068| return c 069| 070| print(calcul_centroide(D[0])) 071| 072| ## Calcul des nouveaux centroides des k clusters 073| def maj_centroides(D): 074| C=[] 075| k=len(D) 076| for i in range(k): 077| c=calcul_centroide(D[i]) 078| C.append(c) 079| return C 080| 081| C=maj_centroides(D) 082| print(C) 083| 084| ## Fonction k_means 085| def k_means(data,k,n): 086| C0=centroides_depart(data,k) 087| D=partitions(data,C0) 088| C1=maj_centroides(D) 089| c=1 090| while c<n and C0!=C1: 091| c=c+1 092| C0=C1 093| D=partitions(data,C0) 094| C1=maj_centroides(D) 2 095| return C1,D 096| 097| ## Recherche du k optimum: Méthode du coude 098| import matplotlib.pyplot as plt 099| 100| X,Y=[],[] 101| for k in range(1,11): 102| X.append(k) 103| C,D=k_means(data,k,50) 104| s=0 105| for i in range(k): 106| for e in D[i]: 107| s=s+distance(e,C[i]) 108| Y.append(s) 109| plt.plot(X,Y,'*-') 110| plt.grid() 111| plt.show() 112| 113| 114| ## Représentation graphique des résultats en utilisant le k optimum 115| import matplotlib.pyplot as plt 116| k=5 117| C,D=k_means(data,k,50) 118| for i in range(k): 119| X,Y=[],[] 120| for e in D[i]: 121| X.append(sum(e[:-1])) 122| Y.append(e[-1]) 123| plt.scatter(X,Y) 124| plt.show()
Devoir de Contrôle N°1 Avec Correction - Math Etude de Fonctions-Fonctions Réciproques-Suites Réelles-Nombres Complexes - Bac Math (2014) MR Mhamdi Abderrazek