2016-03-24 2 views
4

sklearn.cluster KMeansパッケージを使用しています。クラスタ化が完了したら、どの値がグループ化されているかを知る必要がある場合、どのようにすればよいですか?Python sklearn-KMeansクラスタの値を取得する方法

私は100データポイントを持っており、KMeansは私に5クラスタを与えたと言う。今私はどのデータポイントがクラスタ5にあるのかを知りたいのですが、どうすればいいですか?

感謝をクラスタIDを与えるために、それがそのクラスタ内のすべてのデータポイントを一覧表示されますが機能です。あなたは第一及び第二の点を見ることができるように

答えて

0

あなたは一例

km = KMeans(2) 
km.fit([[1,2,3],[2,3,4],[5,6,7]]) 
print km.labels_ 
output: array([1, 1, 0], dtype=int32) 

について属性labels_

で見ることができ、クラスタ1、クラスタ0の最後のポイントです。

+0

内のすべてのデータ点をフィルタリングするために、例えば、 フィルタリングするのは非常に容易です。しかし、データポイントの多くが繰り返されるときに、ラベルを取得するためにそれらのすべてを反復することは効率的ではありません。私はちょうど与えられたクラスタのデータポイントのリストでした。これを行う別の方法はありませんか? – user77005

3

大きなデータセットがあり、オンデマンドでクラスタを抽出する必要がある場合は、numpy.whereを使用していくつかのスピードアップが表示されます。

from sklearn.cluster import KMeans 
from sklearn import datasets 
import numpy as np 

centers = [[1, 1], [-1, -1], [1, -1]] 
iris = datasets.load_iris() 
X = iris.data 
y = iris.target 

km = KMeans(n_clusters=3) 
km.fit(X) 

ここで提供するcluster_idのインデックスを抽出する関数を定義します。 (ここでは、2つの機能がベンチマークのために、彼らの両方が同じ値を返す、です):

def ClusterIndicesNumpy(clustNum, labels_array): #numpy 
    return np.where(labels_array == clustNum)[0] 

def ClusterIndicesComp(clustNum, labels_array): #list comprehension 
    return np.array([i for i, x in enumerate(labels_array) if x == clustNum]) 

はあなたがクラスタ2内にあるすべてのサンプルをしたいとしましょう:

ClusterIndicesNumpy(2, km.labels_) 
array([ 52, 77, 100, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 
     115, 116, 117, 118, 120, 122, 124, 125, 128, 129, 130, 131, 132, 
     134, 135, 136, 137, 139, 140, 141, 143, 144, 145, 147, 148]) 

numpyのは、ベンチマークを受賞:

%timeit ClusterIndicesNumpy(2,km.labels_) 

100000 loops, best of 3: 4 µs per loop 

%timeit ClusterIndicesComp(2,km.labels_) 

1000 loops, best of 3: 479 µs per loop 

今、あなたはそのようなあなたのクラスタ2のデータ点のすべてを抽出することができます。

X[ClusterIndicesNumpy(2,km.labels_)] 

array([[ 6.9, 3.1, 4.9, 1.5], 
     [ 6.7, 3. , 5. , 1.7], 
     [ 6.3, 3.3, 6. , 2.5], 
     ... #truncated 

上記切り捨て配列から最初の3つの指標をダブルチェック:

print X[52], km.labels_[52] 
print X[77], km.labels_[77] 
print X[100], km.labels_[100] 

[ 6.9 3.1 4.9 1.5] 2 
[ 6.7 3. 5. 1.7] 2 
[ 6.3 3.3 6. 2.5] 2 
2

私は同様の要件を持っていたし、私は列としてデータセットのインデックスとラベルを持つ新しいデータフレームを作成するために、パンダを使用しています。

data = pd.read_csv('filename') 

km = KMeans(n_clusters=5).fit(data) 

cluster_map = pd.DataFrame() 
cluster_map['data_index'] = data.index.values 
cluster_map['cluster'] = km.labels_ 

データフレームが利用可能になったら、はい、この方法がうまくいくクラスタ3

cluster_map[cluster_map.cluster == 3] 
関連する問題