2012-02-20 7 views
9

私はSciPyの階層凝集型クラスタリング手法を使ってm×n行列の特徴をクラスタリングしていますが、クラスタリングが完了した後、得られたクラスタから重心を取得する方法を見つけることはできません。以下は、私のコードを、次のとおりです。SciPyの階層凝集型クラスタリングから重心を得るには?

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

私は、機能の私の行列を取って、それらの間のユークリッド距離を計算して、階層的クラスタリング方法にそれらを渡しています。そこから、最大100個のクラスタを持つフラットクラスタを作成しています

フラットクラスタTに基づいて、各フラットクラスタを表す1 x n重心をどのように取得できますか?

あなたがこの( D =次元数)のような何かを行うことができます
+1

を持つベクトルとしてパーティションで何が最後に起こったのですか?あなたは問題を解決しましたか?どうやって? –

+0

私は実際にscikit-learnを使ってこれを終了しました。 –

+0

scikit pleasEの機能は? –

答えて

0

# 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

可能な解は、kmeansの中の重心がscipy.cluster.vqのコードブックを返す関数です。あなたが必要とする唯一のものは、フラットクラスタpartと元の観測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) 
関連する問題