SciPy - Cluster
K-means clusteringè un metodo per trovare cluster e centri di cluster in un insieme di dati senza etichetta. Intuitivamente, potremmo pensare a un cluster come - composto da un gruppo di punti dati, le cui distanze tra i punti sono piccole rispetto alle distanze dai punti al di fuori del cluster. Dato un insieme iniziale di centri K, l'algoritmo K-mean itera i seguenti due passaggi:
Per ogni centro, viene identificato il sottoinsieme di punti di formazione (il suo cluster) più vicino ad esso rispetto a qualsiasi altro centro.
Viene calcolata la media di ciascuna caratteristica per i punti dati in ogni cluster e questo vettore medio diventa il nuovo centro per quel cluster.
Questi due passaggi vengono ripetuti fino a quando i centri non si spostano più o le assegnazioni non cambiano più. Quindi, un nuovo puntoxpuò essere assegnato al cluster del prototipo più vicino. La libreria SciPy fornisce una buona implementazione dell'algoritmo K-Means attraverso il pacchetto cluster. Facci capire come usarlo.
Implementazione di K-Means in SciPy
Capiremo come implementare K-Means in SciPy.
Importa K-Means
Vedremo l'implementazione e l'utilizzo di ogni funzione importata.
from SciPy.cluster.vq import kmeans,vq,whiten
Generazione dei dati
Dobbiamo simulare alcuni dati per esplorare il clustering.
from numpy import vstack,array
from numpy.random import rand
# data generation with three features
data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))
Ora dobbiamo controllare i dati. Il programma precedente genererà il seguente output.
array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00],
[ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
[ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
…………….
Normalizza un gruppo di osservazioni in base alle caratteristiche. Prima di eseguire K-Means, è utile riscalare ogni dimensione caratteristica del set di osservazione con lo sbiancamento. Ogni caratteristica è divisa per la sua deviazione standard in tutte le osservazioni per dargli una varianza unitaria.
Sbianca i dati
Dobbiamo usare il seguente codice per sbiancare i dati.
# whitening of data
data = whiten(data)
Calcola le medie K con tre cluster
Calcoliamo ora K-Means con tre cluster utilizzando il codice seguente.
# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)
Il codice sopra esegue K-Means su un insieme di vettori di osservazione che formano K cluster. L'algoritmo K-Means regola i centroidi fino a quando non è possibile ottenere un progresso sufficiente, ovvero il cambiamento nella distorsione, poiché l'ultima iterazione è inferiore a una certa soglia. Qui, possiamo osservare il centroide del cluster stampando la variabile centroidi utilizzando il codice fornito di seguito.
print(centroids)
Il codice precedente genererà il seguente output.
print(centroids)[ [ 2.26034702 1.43924335 1.3697022 ]
[ 2.63788572 2.81446462 2.85163854]
[ 0.73507256 1.30801855 1.44477558] ]
Assegna ogni valore a un cluster utilizzando il codice fornito di seguito.
# assign each sample to a cluster
clx,_ = vq(data,centroids)
Il vq la funzione confronta ogni vettore di osservazione nella 'M' con 'N' obsarray con i centroidi e assegna l'osservazione al cluster più vicino. Restituisce il cluster di ogni osservazione e la distorsione. Possiamo controllare anche la distorsione. Controlliamo il cluster di ciascuna osservazione utilizzando il codice seguente.
# check clusters of observation
print clx
Il codice precedente genererà il seguente output.
array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
I valori distinti 0, 1, 2 della matrice precedente indicano i cluster.