我正在寻找一种方法来分别对矩阵行和列执行聚类,对矩阵中的数据重新排序以反映聚类并将其全部放在一起。聚类问题很容易解决,树状图的创建也很容易解决(例如在 这个博客 或在 《集体智慧编程》)。然而,如何重新排序数据对我来说仍然不清楚。

最终,我正在寻找一种使用朴素的Python(使用任何“标准”库,如numpy、matplotlib等,但没有 使用R 或其他外部工具)。

dendogram
(来源: 英国沃里克大学)

澄清

有人问我重新排序是什么意思。当您首先按矩阵行,然后按列对矩阵中的数据进行聚类时,可以通过两个树状图中的位置来标识每个矩阵单元。如果对原始矩阵的行和列进行重新排序,使得树状图中彼此接近的元素在矩阵中彼此接近,然后生成热图,则数据的聚类对查看者来说可能会变得明显(如上图)

有帮助吗?

解决方案

看我的 最近的回答, ,部分复制如下,至 这个相关问题.

import scipy
import pylab
import scipy.cluster.hierarchy as sch

# Generate features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])

# Compute and plot dendrogram.
fig = pylab.figure()
axdendro = fig.add_axes([0.09,0.1,0.2,0.8])
Y = sch.linkage(D, method='centroid')
Z = sch.dendrogram(Y, orientation='right')
axdendro.set_xticks([])
axdendro.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.8])
index = Z['leaves']
D = D[index,:]
D = D[:,index]
im = axmatrix.matshow(D, aspect='auto', origin='lower')
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.8])
pylab.colorbar(im, cax=axcolor)

# Display and save figure.
fig.show()
fig.savefig('dendrogram.png')

Dendrogram and distance matrix
(来源: stevetjoa.com)

其他提示

我不知道完全理解,但它似乎您试图重新索引基于各种树状图indicies的阵列的每个轴。我想,它假定在每个分支圈定一些比较逻辑。如果是这种情况,那么将这项工作(?):

>>> x_idxs = [(0,1,0,0),(0,1,1,1),(0,1,1),(0,0,1),(1,1,1,1),(0,0,0,0)]
>>> y_idxs = [(1,1),(0,1),(1,0),(0,0)]
>>> a = np.random.random((len(x_idxs),len(y_idxs)))
>>> x_idxs2, xi = zip(*sorted(zip(x_idxs,range(len(x_idxs)))))
>>> y_idxs2, yi = zip(*sorted(zip(y_idxs,range(len(y_idxs)))))
>>> a2 = a[xi,:][:,yi]

x_idxsy_idxs树形图indicies。 a是未排序的矩阵。 xiyi是你新的行/列阵列indicies。 a2是有序矩阵同时x_idxs2y_idxs2是新的,分类聚类indicies。这假设当创建的树形图,一个0分支列/行总是比一个1分支相对更大/更小。

如果您y_idxs和x_idxs不是列表,但numpy的阵列,那么你可以以类似的方式使用np.argsort

我知道这是非常晚的比赛,但我做了基于此页面上的职位代码中的绘图对象。它注册了PIP,所以安装,你只需要调用

pip install pydendroheatmap

在这里签出该项目的GitHub的页面: https://github.com/themantalope/pydendroheatmap

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top