2016-04-09 7 views
1

Ich habe es geschafft, einen Cluster-Bereich mit der Mittelwert-Shift-Clustering-Methode in Python zu generieren. Die Daten wurden aus einer CSV-Datei mit ungefähr 7000 Längen- und Breitenangaben gewonnen. Der Code und das Ergebnis sind nachstehend aufgeführt. Das Problem ist, wie kann ich das Cluster-Mitglied aus jedem Cluster-Bereich generieren?Wie Cluster Member in der mittleren Verschiebung zu sehen

import numpy as np 
from sklearn.cluster import MeanShift, estimate_bandwidth 
from sklearn.datasets.samples_generator import make_blobs 

############################################################################### 
# Generate sample data 
centers = [[1, 1], [-1, -1], [1, -1]] 
import csv 
X1 = [[0 for x in range(2)] for x in range(7161)] 
counter = 0 
with open('datatotal1.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    for row in reader: 
     print row[1] 
     #X.append([row[1], row[2]]) 
     #X = (X, [row[1], row[2]]) 
     X1[counter][0] = float(row[1]) 
     X1[counter][1] = float(row[2]) 
     counter = counter + 1 

#X, _ = make_blobs(n_samples=13, centers=centers, cluster_std=0.6) 
X = np.array(X1) 
#print X 
#print type(X[1]) 
#print X.shape 
############################################################################### 
# Compute clustering with MeanShift 

# The following bandwidth can be automatically detected using 
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=1168) 
bandwidth = 0.00447023 
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True) 
ms.fit(X) 
labels = ms.labels_ 
cluster_centers = ms.cluster_centers_ 

labels_unique = np.unique(labels) 
n_clusters_ = len(labels_unique) 

print("number of estimated clusters : %d" % n_clusters_) 
print("bandwidth: %f" % bandwidth) 

############################################################################### 
# Plot result 
import matplotlib.pyplot as plt 
from itertools import cycle 

plt.figure(1) 
plt.clf() 

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk') 
for k, col in zip(range(n_clusters_), colors): 
    my_members = labels == k 
    cluster_center = cluster_centers[k] 
    print cluster_center 
    plt.plot(X[my_members, 1], X[my_members, 0], col + '.') 
    plt.plot(cluster_center[1], cluster_center[0], 'o', markerfacecolor=col, 
      markeredgecolor='k', markersize=14) 
plt.title('Estimated number of clusters: %d' % n_clusters_) 
plt.show() 

Clustering Result

Antwort

1

Hinweis sicher, dass ich wirklich verstanden, was Sie Ihre Frage nach dem Lesen wieder fragen. Wenn Sie nach der Cluster-ID für jedes Ihrer Features suchen, dann schätze ich, dass sie im labels_ Attribut des MeanShift Objekts in Ihrem Fall in der gleichen Reihenfolge wie Ihr Eingabe-Array gefunden werden können.

Am Beispiel von den documentation:

In [12]: centers = [[1, 1], [-1, -1], [1, -1]] 
    ...: 
    ...: X, _ = make_blobs(n_samples=10000, centers=centers, cluster_std=0.6) 
    ...: bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=500) 
    ...: 
    ...: ms = MeanShift(bandwidth=bandwidth, bin_seeding=True) 
    ...: ms.fit(X) 
    ...: labels = ms.labels_ 
    ...: cluster_centers = ms.cluster_centers_ 
    ...: 

In [16]: df = pd.DataFrame({"coords": X.tolist(), "label": labels}) 

In [17]: df.head() 
Out[17]: 
             coords label 
0 [-1.5539732702382636, -0.4869122066516913]  2 
1 [0.6348936165717934, 0.7771388572513406]  1 
2 [0.7891587478804111, -1.1108675230054534]  0 
3 [0.5728268980231348, 0.16462711784126938]  1 
4 [1.1696896258095544, 0.17203555282372351]  1 
+0

Dank Mann, habe ich versucht, es und es funktioniert! – Kenken

+0

@Kenken Sie sind herzlich willkommen! Bedenken Sie auch, diese Antwort zu akzeptieren, wenn Ihr Problem vollständig gelöst ist! – mgc

+0

Könnten Sie bitte einen Link zu dem Algorithmus hinter der Cluster-Kennzeichnung erklären/veröffentlichen? – Dmitry