2012-02-20 7 views
9

Korzystam z hierarchicznych aglomeracyjnych metod klastrowania SciPy, aby zgrupować macierz m x n funkcji, ale po tym, jak tworzenie klastrów jest kompletne, nie mogę wymyślić, jak uzyskać centroid z wynikowych klastrów. Poniżej następuje mój kod:Jak zdobyć centroidy z hierarchicznego aglomeracyjnego klastrowania SciPy?

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

Biorę moją macierz funkcji, obliczanie odległości euklidesowej między nimi, a następnie przekazując je na hierarchicznej metody grupowania. Stamtąd tworzę płaskie klastry, z maksymalnie 100 klastrami

Teraz, w oparciu o płaskie klastry T, jak uzyskać centymetr 1 x n reprezentujący każdą płaską gromadę?

+1

Więc co stało się w końcu? Czy rozwiązałeś problem? W jaki sposób? –

+0

Właściwie to skończyłem używając scikit-learn dla tego. –

+0

Która funkcja jest przyjemna w nauce? –

Odpowiedz

0

można zrobić coś takiego (D = liczbie wymiarów):

# 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]) 

To daje słownik z liczbą klastrów jako klucz i ciężkości konkretnego klastra jako wartość.

1

Możliwym rozwiązaniem jest to funkcja, która zwraca słownika z centroidów jak kmeans w scipy.cluster.vq nie. Jedyne czego potrzebujesz to partycja jako wektor z płaskich klastrów part i oryginalnych obserwacji 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)