如何将聚类结果可视化为基于其聚类的具有不同节点颜色的图形?

How to visualize the cluster result as a graph with different node color based on its cluster?

我有 .csv 格式的图形数据测地线距离

我想使用多维缩放 (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

如何将聚类结果可视化为基于其聚类的具有不同节点颜色的图形?

您不需要 MDS 到 运行 kMedoids - 只需 运行 它在原始距离矩阵上(也可以通过将最小值切换为最大值来使 kMedoids 在相似性矩阵上工作)。

仅将 MDS 用于绘图。

通常的可视化方法是在集群上使用循环,并用不同的颜色绘制每个集群;或使用颜色谓词。 scipy 文档中有很多示例。

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 mds 结果)并且 labels 是每个点的整数簇号。由于您在 "labels" 布局中没有数据,请考虑改用循环:

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