#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Jul 25 10:06:08 2018 @author: valerie """ import numpy as np from sklearn.cluster import KMeans from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt from urllib.request import urlopen # Chargement des données ====================================================== url="https://perso.univ-rennes1.fr/valerie.monbet/doc/cours/digits_extrait_images.csv" digits=np.loadtxt(urlopen(url), delimiter=',',skiprows=1,usecols=range(1,785)) url="https://perso.univ-rennes1.fr/valerie.monbet/doc/cours/digits_extrait_labels.csv" labels=np.loadtxt(urlopen(url), delimiter=',',skiprows=1,usecols=range(1,2)) # Clustering avec la fonction KMeans du module scikit learn =================== n_clusters=len(np.unique(labels)) k_means = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10) k_means.fit(digits) cl = k_means.labels_ # classes "prédites" # Images des centres de classe plt.close('all') fig=plt.figure(2) plt.clf() for k in range(n_clusters): plt.subplot(1,n_clusters,k+1) plt.imshow(np.reshape(k_means.cluster_centers_[k,:],[28,28])) plt.title("Cluster "+str(k)) plt.show() # Calcul de l'étiquette majoritaire de chaque classe cl_lab = np.copy(cl) for k in range(n_clusters): ii = np.where(cl==k)[0] # Individus de la classe k counts=np.unique(labels[ii],return_counts=True) # Nb d'occurences de chaque label imax=np.argmax(counts[1]) # Calcul du majoritaire maj_lab=counts[0][imax] # Son étiquette print("Classe "+str(k)+", label majoritaire = "+str(maj_lab)) cl_lab[ii] = maj_lab # Calcul de la matrice de confusion conf_mat = confusion_matrix(labels,cl_lab) print("Matrice de confusion:") print(" Une ligne = n digit. Une colonne = un cluster\n") print(conf_mat) # Représentation en barplot def BarPlotMat(M): # Fait un barplot pour chaque colonne de M. # La couleur correspond à l'indice, la hauteur à la valeur I=M.shape[0] J=M.shape[1] ind = np.arange(J) plots = [] height_cumul = 0 for i in range(I): color = plt.cm.inferno(i/I, 1) if k == 0: p = plt.bar(ind,M[i,:],width=.35, color=color) else: p = plt.bar(ind,M[i,:], bottom=height_cumul, color=color) height_cumul +=M[i,:] plots.append(p) fig=plt.figure(3) plt.clf() BarPlotMat(conf_mat) plt.xlabel('Groupe') plt.ylabel('Répartition') plt.title('Répartition des groupe dans chaque cluster') plt.legend(['0','1','2','3','4',]) # Gaussian mixture from sklearn import mixture greatest_bic = -np.infty bic = [] n_components_ = 5 cv_types = ['spherical', 'tied', 'diag', 'full'] for cv_type in cv_types: # Fit a Gaussian mixture with EM gmm = mixture.GaussianMixture(n_components=n_components_, covariance_type=cv_type) gmm.fit(digits) bic.append(gmm.bic(digits)) if bic[-1] > greatest_bic: greatest_bic = bic[-1] best_gmm = gmm # Images des centres de classe plt.close('all') fig=plt.figure(2) plt.clf() for k in range(n_clusters): plt.subplot(1,n_clusters,k+1) plt.imshow(np.reshape(best_gmm.means_[k,:],[28,28])) plt.title("Cluster "+str(k)) plt.show() cl_gmm = best_gmm.predict(digits) # Calcul de l'étiquette majoritaire de chaque classe cl_lab_gmm = np.copy(cl_gmm) for k in range(n_clusters): ii = np.where(cl_gmm==k)[0] # Individus de la classe k counts=np.unique(labels[ii],return_counts=True) # Nb d'occurences de chaque label imax=np.argmax(counts[1]) # Calcul du majoritaire maj_lab=counts[0][imax] # Son étiquette print("Classe "+str(k)+", label majoritaire = "+str(maj_lab)) cl_lab_gmm[ii] = maj_lab # Calcul de la matrice de transition brute conf_mat_gmm = confusion_matrix(labels,cl_lab_gmm) print("Matrice de confusion:") print(" Une ligne = n digit. Une colonne = un cluster\n") print(conf_mat_gmm) fig=plt.figure(3) plt.clf() BarPlotMat(conf_mat_gmm) plt.xlabel('Groupe') plt.ylabel('Répartition') plt.title('Répartition des groupe dans chaque cluster') plt.legend(['0','1','2','3','4',])