2016-03-24 21 views
4

sklearn.cluster KMeans paketini kullanıyorum. Kümelenmeyi bitirdiğimde, hangi değerlerin birlikte gruplandığını bilmem gerekiyorsa bunu nasıl yapabilirim?Python sklearn-KMeans kümedeki değerler nasıl elde edilir

100 veri puanı aldığımı ve KMeans'in 5 kümeyi verdiğini varsayalım. Şimdi hangi veri noktalarının kümede olduğunu bilmek istiyorum 5. Bunu nasıl yapabilirim.

orada bir işlev küme kimliği vermek ve bu kümede

Teşekkür tüm veri noktalarını listeler mı. Eğer birinci ve ikinci noktayı görebileceğiniz gibi

cevap

0

Örneğin

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

için öznitelik labels_

bakabilirsiniz küme 1, kümede 0 son noktasıdır.

+0

devamı yöntem işe İdime 3 de, tüm veri noktaları filtre oldukça kolaydır. Ancak, etiketlerin verimli olması için hepsinde yinelenen çok fazla veri noktası olduğunda. Sadece belirli bir kümenin veri noktalarının listesiydi. Bunu yapmanın başka bir yolu yok mu? – user77005

3

Büyük bir veri kümeniz varsa ve isteğe bağlı kümeleri çıkarmanız gerekiyorsa, numpy.where'u kullanarak bir miktar hızlanma görürsünüz. İşte iris veri kümesi üzerinde bir örnektir:

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) 

sağladığınız cluster_id endeksleri ayıklamak için bir fonksiyon tanımlanır. (Burada iki işlev karşılaştırma için, her ikisi de aynı değerleri döndürür vardır):

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 kriter kazanır:

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

Diyelim ki küme 2 bulunan tüm numunelerin istediğinizi varsayalım

%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 

Artık çok sevdiği küme 2 veri noktalarının tümünü çıkarabilir:

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 

kez daha kontrol yukarıdaki kesik diziden ilk üç endeks: Ben benzer bir gereksinim vardı ve ben veri kümesinin indeksi ile yeni bir dataframe oluşturmak için pandaların kullanıyorum

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

ve sütunlar gibi etiketler .

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_ 

DataFrame kullanılabilir olduğunda

Örneğin, , filtre

cluster_map[cluster_map.cluster == 3] 
İlgili konular