Tesina Intelligenza Artificiale Maria Serena Ciaburri s231745 A.A. 2016-2017 Lo scopo di questa tesina è quello di clusterizzare con l algoritmo K-Means i dati presenti nel dataset MNIST e di calcolare per ogni cluster formato l indice di eterogeneità di Gini. Per raggiungere questo obiettivo è stato realizzato uno script in Python. I dati utilizzati sono contenuti nel dataset MNIST, una raccolta di cifre numeriche scritte a mano e salvate come immagini in bianco e nero di 28x28 pixels. Nel nostro caso è stato utilizzato il training set (disponibile al link: http://yann.lecun.com/exdb/mnist/), contente 60,000 immagini. L algoritmo K-Means è un algoritmo di clusterizzazione in cui il numero (k) di centroidi viene scelto all inizio e in cui i centroidi di ogni cluster vengono calcolati come media (means) di tutti i dati presenti in un cluster. Inizialmente, quindi, si scelgono in modo casuale k centroidi. Successivamente, si assegna ogni dato disponibile a uno di questi cluster e si ricalcolano i centri di cluster come media di tutti i punti presenti in quel cluster. Questo processo viene ripetuto fino a quando non si ha convergenza (cioè fino a quando i centroidi non cambiano). L indice di eterogeneità Gini è una misura dell eterogeneità di un campione {a!, a!,, a! } in cui ogni elemento può assumere s valori distiniti {v!, v!,, v! }. Il calcolo dell eterogeneità è basato sul valore f! della frequenza relativa dell elemento v! per i = 1, 2, s secondo la formula:! I = 1 f!! L indice può assumere valori compresi tra 0 e 1. In caso di eterogeneità minima (quando si ha quindi omogeneità massima), tutti gli elementi del campione assumono lo stesso valore, quindi I = 0. In caso di eterogeneità massima (quindi omogeneità minima) tutte le osservazioni hanno la stessa frequenza (f! =!!!! ) quindi I =.!! L indice di eterogeneità di Gini normalizzato si ottiene dividendo la quantità trovata per l indice massimo: I!"#$%&'((%)" =!!! I s 1 s = s I s 1 Lo script Lo script Python realizzato per svolgere la tesina è diviso in due moduli: gini. py (il modulo principale) e functions. py (quello che contiene le definizioni delle funzioni chiamate). Per eseguire lo script, bisogna semplicemente digitare nella finestra del terminale il seguente comando: python gini. py < k > < flag > dove < k > è il numero di cluster che vogliamo formare con K-Means e < flag > è un flag che viene settato per avere una visualizzazione grafica dei centroidi finali e del contenuto dei cluster ottenuti.
Le librerie principali utilizzate da questo script sono: -matplotlib, necessaria per la visualizzazione grafica dei dati ottenuti -numphy, una libreria di supporto per vettori e matrici multidimensionali -scikit.learn, una libreria open source contenente algoritmi per data mining e data analysis. In particolare, è stato utilizzato il modulo sklearn. cluster (link: http://scikitlearn.org/stable/modules/generated/sklearn.cluster.kmeans.html). La prima operazione che viene effettuata è l acquisizione dei dati, grazie alla funzione load_mnist() contenuta nel modulo functions. py. Il formato dei dati MNIST è chiamato IDX ed è un formato per vettori e matrici multidimensionali di numeri. La funzione load_mnist() interpreta il formato dei file e ritorna due insiemi di dati: le immagini (un vettore 3D in cui ogni elemento è un vettore 28x28) e le labels corrispondenti alle immagini. Le immagini vengono poi trasformate in vettori di 784 elementi, grazie alla funzione reshape della libreria numphy, in modo da poter essere elaborate dall algorimto K-Means. A questo punto, viene creato un oggetto della classe sklearn. cluster. KMeans: KMeans(n_clusers=8, init= k-means++, n_init=10, max_iter=300, tol=0.0001,precompute_ distance= auto, verbose=0, random_state=none, copy_x=true, n_jobs=1, algorithm= auto ) e viene successivamente chiamato il metodo fit() per effettuare il clustering dei dati. Una volta formati tutti i cluster, da ognuno di questi vengono estratti i dati contenuti e vengono calcolate le frequenze relative di ogni label. Vengono poi calcolati, sempre per ogni cluster, l indice di eterogeneità di Gini e la sua normalizzazione secondo la formula mostrata in precedenza. Una volta calcolati tutti gli indici del cluster, viene presentato a video un grafico a barre che mostra per ogni cluster il valore dell indice di Gini e della sua normalizzazione. Se il flag per la visualizzazione dei centroidi e dei cluster finali è stato settato ad 1, a questo punto vengono mostrate a video anche le immagini (28x28 pixels) degli ultimi centroidi ottenuti e le immagini dei dati contenuti in ogni cluster. Un esempio di visualizzazione dei centroidi finali è il seguente:
Qui, invece, abbiamo un esempio della visualizzazione di alcuni cluster ottenuti:
Risultati Di seguito abbiamo i risultati ottenuti dallo script con diversi valori di k: k=10
k=15 k =20
k =25 k=30