2012-02-20 32 views
9

Tôi đang sử dụng các phương pháp phân cụm kết cấu phân cấp của SciPy để nhóm một ma trận m x n các tính năng, nhưng sau khi phân cụm xong, tôi không thể tìm ra cách lấy trọng tâm từ các cụm kết quả. Bên dưới tuân theo mã của tôi:Làm cách nào để lấy trọng tâm từ phân cụm kết tụ phân cấp của SciPy?

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

Tôi lấy ma trận tính năng, tính toán khoảng cách euclide giữa chúng và sau đó chuyển chúng vào phương pháp phân cấp theo cấp bậc. Từ đó, tôi tạo các cụm phẳng, với tối đa 100 cụm

Bây giờ, dựa trên các cụm phẳng T, làm thế nào để tôi lấy được 1 x n centroid đại diện cho mỗi cụm phẳng?

+1

Vậy điều gì đã xảy ra cuối cùng? Bạn đã giải quyết vấn đề chưa? Làm sao? –

+0

Tôi thực sự đã kết thúc bằng cách sử dụng scikit-học cho việc này. –

+0

Chức năng nào trong scikit pleasE? –

Trả lời

0

Bạn có thể làm một cái gì đó như thế này (D = số kích thước):

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

này sẽ cung cấp cho bạn một cuốn từ điển với số cụm như chìa khóa và trọng tâm của cụm cụ thể như giá trị.

1

Một giải pháp có thể là một hàm, trả về một cuốn sách mã với các centroid như kmeans trong scipy.cluster.vq. Chỉ có điều bạn cần là phân vùng như vector với cụm phẳng part và những quan sát ban đầu 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) 
Các vấn đề liên quan