【问题标题】:How to visualize the cluster result as a graph with different node color based on its cluster?如何根据集群将集群结果可视化为具有不同节点颜色的图形?
【发布时间】:2016-11-24 10:26:10
【问题描述】:

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

我想使用多维缩放 (MDS) 将其缩减为 2D 并使用 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

如何根据集群将集群结果可视化为具有不同节点颜色的图形?

【问题讨论】:

    标签: python csv graph cluster-analysis networkx


    【解决方案1】:

    您不需要 MDS 来运行 kMedoids - 只需在原始距离矩阵上运行它(kMedoids 也可以通过将 min 切换为 max 来处理相似矩阵)。

    仅将 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 是每个点的整数簇号。由于您的数据没有在“标签”布局中,因此请考虑使用循环:

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

    【讨论】:

    • 它有错误:( y_pred = labels.astype(np.int) AttributeError : 'list' object has no attribute 'astype'
    • sn-p 来自链接的网页,这不是你的标签列表。您需要将您的集群分配转换为这样一个 numpy 数组。 labels 是 python 中的常用名称,sklearn 会返回它。由于您有自己的 kmedoid,因此您需要对其进行修改以生成此格式。
    • 我应该修改哪个?我真的很困惑
    • 查看链接。或者使用我发布的替代方法。
    猜你喜欢
    • 2017-02-01
    • 2016-07-26
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2021-05-18
    • 2023-01-17
    • 2021-02-14
    • 2020-07-08
    相关资源
    最近更新 更多