2016-07-21 16 views
-1

ich habe einen geodätischen Abstand von Diagrammdaten im CSV-FormatWie visualisiert man das Cluster-Ergebnis als Graph mit unterschiedlicher Farbe des Knotens basierend auf seinem Cluster?

data.csv

ich es in 2D mit Multidimensionale Skalierung (MDS) und Cluster Kmedoids

mit reduzieren will Dies ist mein Code:

# coding: utf-8 
import numpy as np 
import csv 
from sklearn import manifold 
from sklearn.metrics.pairwise import pairwise_distances 
import kmedoidss 

rawdata = csv.reader(open('data.csv', 'r').readlines()[1:]) 

# Process the data into a 2D array, omitting the header row 
data, labels = [], [] 
for row in rawdata: 
    labels.append(row[1]) 
    data.append([int(i) for i in row[1:]]) 
#print data 

# Now run very basic MDS 
# Documentation here: http://scikit-learn.org/dev/modules/generated/sklearn.manifold.MDS.html#sklearn.manifold.MDS 
mds = manifold.MDS(n_components=2, dissimilarity="precomputed") 
pos = mds.fit_transform(data) 

# distance matrix 
D = pairwise_distances(pos, metric='euclidean') 

# split into c clusters 
M, C = kmedoidss.kMedoids(D, 3) 

print ('Data awal : ') 
for index, point_idx in enumerate(pos, 1): 
    print(index, point_idx) 

print ('\n medoids:') 
for point_idx in M: 
    print('{} index ke - {} '.format (pos[point_idx], point_idx+1)) 

print('') 
print('clustering result:') 
for label in C: 
    for point_idx in C[label]: 
     print('cluster- {}:{} index- {}'.format(label, pos[point_idx], point_idx+1)) 

kmedoidss.py

import numpy as np 
import random 

def kMedoids(D, k, tmax=100): 
    # determine dimensions of distance matrix D 
    m, n = D.shape 

    # randomly initialize an array of k medoid indices 
    M = np.sort(np.random.choice(n, k)) 

    # create a copy of the array of medoid indices 
    Mnew = np.copy(M) 

    # initialize a dictionary to represent clusters 
    C = {} 
    for t in xrange(tmax): 
     # determine clusters, i. e. arrays of data indices 
     J = np.argmin(D[:,M], axis=1) 
     for kappa in range(k): 
      C[kappa] = np.where(J==kappa)[0] 
     # update cluster medoids 
     for kappa in range(k): 
      J = np.mean(D[np.ix_(C[kappa],C[kappa])],axis=1) 
      j = np.argmin(J) 
      Mnew[kappa] = C[kappa][j] 
     np.sort(Mnew) 
     # check for convergence 
     if np.array_equal(M, Mnew): 
      break 
     M = np.copy(Mnew) 
    else: 
     # final update of cluster memberships 
     J = np.argmin(D[:,M], axis=1) 
     for kappa in range(k): 
      C[kappa] = np.where(J==kappa)[0] 

    # return results 
    return M, C 

Wie visualisiert man das Cluster-Ergebnis als Graph mit unterschiedlicher Knotenfarbe basierend auf seinem Cluster?

Antwort

0

Sie benötigen kein MDS, um kMedoids auszuführen - führen Sie es einfach auf der ursprünglichen Distanzmatrix aus (kMedoids können auch dazu gebracht werden, auf einer Ähnlichkeitsmatrix zu arbeiten, indem Sie min für max umschalten).

Verwenden Sie MDS nur zum Plotten.

Der übliche Ansatz für die Visualisierung besteht darin, eine Schleife über Cluster zu verwenden und jeden Cluster in einer anderen Farbe darzustellen; oder um ein Farbprädikat zu verwenden. Es gibt viele Beispiele in der scipy Dokumentation.

http://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html

colors = np.array([x for x in 'bgrcmykbgrcmykbgrcmykbgrcmyk']) 
colors = np.hstack([colors] * 20) 
y_pred = labels.astype(np.int) 
plt.scatter(X[:, 0], X[:, 1], color=colors[y_pred].tolist(), s=10) 

wo X Ihre pos Variable (2d mds RESULT) und labels eine ganze Zahl Cluster-Nummer für jeden Punkt. Da Sie Ihre Daten nicht Layout in thid "Labels" haben, sollten Sie eine Schleife statt:

for label, pts in C.items(): 
    plt.scatter(pos[pts, 0], pos[pts, 1], color=colors[label]) 
plt.show() 
+0

es hat Fehler :( 'y_pred = labels.astype (np.int) Attribute: 'Liste' Objekt hat kein Attribut 'astype' ' – kikiegoguma

+0

Das Snippet stammt von der verlinkten Webseite, dies ist nicht * Ihre * Beschriftungsliste.Sie müssen Ihre Cluster-Zuweisung in ein solches numpliges Array transformieren.' labels' ist der übliche Name in Python, und sklearn würde dies zurückgeben. Da Sie Ihre eigenen kmedoids haben, müssen Sie sie ändern, um dieses Format zu produzieren. –

+0

was sollte ich ändern? ich wirklich verwirrt – kikiegoguma