2012-02-20 11 views
9

Özelliklerin bir m x n matrisini kümelemek için SciPy'nin hiyerarşik kümelenme kümeleme yöntemlerini kullanıyorum, ancak kümeleme tamamlandıktan sonra, ortaya çıkan kümelerden centroid'i nasıl alacağımı anlayamıyorum. Ben hiyerarşik kümeleme yöntemine üzerine iletmeden sonra, özellikler benim matrisi alarak aralarındaki Öklid mesafe hesaplama ve amSciroid'in hiyerarşik kümelenmiş kümelemesinden nasıl centroid elde edilir?

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

: Aşağıda kodumu izler. Oradan, düz kümeler oluşturuyorum, en fazla 100 küme olan

Şimdi, düz kümeler T'ye dayanarak, her bir düz kümeyi temsil eden 1 x n centroid'i nasıl alabilirim?

+1

Yani sonunda ne oldu orijinal gözlemlerle vektörü olarak bölme nedir? Sorunu çözdün mü? Nasıl? –

+0

Aslında bunun için scikit-learn kullanarak bitti. –

+0

Hangi işlev scikit pleasE? –

cevap

0

Bunu (boyutların D = sayısı) gibi bir şey yapabilirsiniz: Bu, anahtar ve değer olarak belirli kümenin ağırlık merkezi olarak küme numarası ile bir sözlük verecektir

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

.

1

Olası bir çözüm, scipy.cluster.vq'da kmeans gibi bir kod çizelgesini döndüren bir işlevdir. Sadece ihtiyacın şey düz kümeler part ve 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) 
İlgili konular