2015-08-26 19 views
7

Sklearn kullanarak Kmeans kullanarak kümeleme yaptım. Centroidleri basmak için bir yöntemi olsa da, scikit-learn'in, her kümenin (veya şimdiye kadar hiç görmediğim) küme noktalarını yazdırmak için bir yönteme sahip olmayan bir biçimde, onu bulmaya çalışıyorum. Her kümenin kümelenme noktalarını elde etmek için düzgün bir yol var mı?küme noktaları (scikit öğrenmek)

def getClusterPoints(V, labels): 
    clusters = {} 
    for l in range(0, max(labels)+1): 
     data_points = [] 
     indices = [i for i, x in enumerate(labels) if x == l] 
     for idx in indices: 
      data_points.append(V[idx]) 
     clusters[l] = data_points 
    return clusters 

Öneriler/bağlantılar çok takdir edilmektedir: V veri kümesi olduğu

Şu anda bunu yapmak için bu oldukça cludgy kodu var.

Teşekkürler! PD.

+0

Bunu yapan oldukça cludgy işlevi var. Hala daha özlü ve daha temiz bir şey olup olmadığına bakıyorum. – user1717931

cevap

18

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

iris = datasets.load_iris() 
X = iris.data 
y = iris.target 

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

Sen

estimator.labels_ 

Out tarafından her noktanın kümeleri alabilirsiniz:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 
    2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 
    1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1], dtype=int32) 

Sonra

{i: np.where(estimator.labels_ == i)[0] for i in range(estimator.n_clusters)} 

Out her küme için puan endekslerini olsun:

{0: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
     34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]), 
1: array([ 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 
     64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
     78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 
     91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 106, 113, 114, 
     119, 121, 123, 126, 127, 133, 138, 142, 146, 149]), 
2: 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])} 

Edit

sen ziyade değerler olarak X noktaların dizi kullanmak istiyorsanız Dizin dizisi:

{i: X[np.where(estimator.labels_ == i)] for i in range(estimator.n_clusters)} 
+0

Teşekkürler! Çok temiz. – user1717931

2

documentation'u okursanız, kmlerin labels_ özniteliğine sahip olduğunu görebilirsiniz. Bu özellik kümeleri sağlar.

aşağıda tam örneğe bakın: Örneğin

import matplotlib.pyplot as plt 
from sklearn.cluster import MiniBatchKMeans, KMeans 
from sklearn.metrics.pairwise import pairwise_distances_argmin 
from sklearn.datasets.samples_generator import make_blobs 
import numpy as np 

############################################################################## 
# Generate sample data 
np.random.seed(0) 

batch_size = 45 
centers = [[1, 1], [-1, -1], [1, -1]] 
n_clusters = len(centers) 
X, labels_true = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7) 

############################################################################## 
# Compute clustering with Means 

k_means = KMeans(init='k-means++', n_clusters=3, n_init=10) 
k_means.fit(X) 

############################################################################## 
# Plot the results 
for i in set(k_means.labels_): 
    index = k_means.labels_ == i 
    plt.plot(X[index,0], X[index,1], 'o') 
plt.show() 
İlgili konular