2012-02-20 15 views
9

Sto usando i metodi di clustering gerarchico agglomerativo di SciPy per raggruppare una matrice di caratteristiche m x n, ma dopo che il clustering è completo, non riesco a capire come ottenere il centroide dai cluster risultanti. Qui di seguito segue il mio codice:Come ottenere i centroidi dal clustering gerarchico gerarchico di SciPy?

Y = distance.pdist(features) 
Z = hierarchy.linkage(Y, method = "average", metric = "euclidean") 
T = hierarchy.fcluster(Z, 100, criterion = "maxclust") 

mi prendo la mia matrice di caratteristiche, calcolando la distanza euclidea tra di loro, e poi li passa sul metodo di clustering gerarchico. Da lì, sto creando cluster piatti, con un massimo di 100 cluster

Ora, in base ai cluster piatti T, come faccio ad ottenere il centroide 1 x n che rappresenta ciascun cluster piatto?

+1

Allora cosa è successo alla fine? Hai risolto il problema? Come? –

+0

In realtà ho finito per usare scikit-learn per questo. –

+0

Quale funzione in scikit fa piacere? –

risposta

0

si può fare qualcosa di simile (D = numero di dimensioni):

# Sum the vectors in each cluster 
lens = {}  # will contain the lengths for each cluster 
centroids = {} # will contain the centroids of each cluster 
for idx,clno in enumerate(T): 
    centroids.setdefault(clno,np.zeros(D)) 
    centroids[clno] += features[idx,:] 
    lens.setdefault(clno,0) 
    lens[clno] += 1 
# Divide by number of observations in each cluster to get the centroid 
for clno in centroids: 
    centroids[clno] /= float(lens[clno]) 

Questo vi darà un dizionario con numero di cluster come la chiave e il baricentro del gruppo specifica come valore.

1

Una possibile soluzione è una funzione che restituisce un libro di codici con i centroidi come kmeans in scipy.cluster.vq. L'unica cosa che vi serve è la partizione come vettore con i cluster piatte part e le osservazioni originali X

def to_codebook(X, part): 
    """ 
    Calculates centroids according to flat cluster assignment 

    Parameters 
    ---------- 
    X : array, (n, d) 
     The n original observations with d features 

    part : array, (n) 
     Partition vector. p[n]=c is the cluster assigned to observation n 

    Returns 
    ------- 
    codebook : array, (k, d) 
     Returns a k x d codebook with k centroids 
    """ 
    codebook = [] 

    for i in range(part.min(), part.max()+1): 
     codebook.append(X[part == i].mean(0)) 

    return np.vstack(codebook) 
Problemi correlati