2016-07-21 6 views
-1

я есть геодезический расстояние данных графа в формате .csvКак визуализировать результат кластера как график с другим цветом узла на основе его кластера?

data.csv

я хочу, чтобы уменьшить его в 2D с использованием многомерного шкалирования (MDS) и группироваться его с помощью Kmedoids

Это мой код:

# 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 

Как визуализировать результат кластера как график с различным цветом узла на основе его кластера?

ответ

0

Вам не нужно MDS для запуска kMedoids - просто запустите его на исходной матрице расстояния (kMedoids также можно заставить работать с матрицей подобия, переключая min для max).

Используйте MDS только для печати.

Обычный подход для визуализации заключается в использовании цикла над кластерами и построении каждого кластера в другом цвете; или использовать предикат цвета. Есть много примеров в скудной документации.

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) 

, где X ваша pos переменного (2d МДС результата) и labels является числом целого числа кластера для каждой точки. Так как у вас нет данных в thid "этикетки" макет, рекомендуется использовать цикл вместо:

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

имеет ошибки :( 'y_pred = labels.astype (np.int) AttributeError: 'список' объект не имеет атрибута 'astype' ' – kikiegoguma

+0

Этот сниппет находится со связанной веб-страницы, это не * ваш список ярлыков. Вам нужно преобразовать назначение кластера в такой массив numpy.' labels' - это обычное имя в python, и sklearn вернул бы это. Поскольку у вас есть свои собственные kmedoids, вам нужно изменить его, чтобы создать этот формат. –

+0

, который я должен изменить? Я действительно смущен – kikiegoguma

 Смежные вопросы

  • Нет связанных вопросов^_^