我正在寻找一种在矩阵行上而不是在列上分别执行聚类的方法,对矩阵中的数据进行重新排序以反映聚类并将它们放在一起。聚类问题很容易解决,树形图创建也是如此(例如在this blog或"Programming collective intelligence"中)。但是,如何重新排序数据仍然不清楚。
最终,我正在寻找一种使用朴素Python(使用任何“标准”库,如numpy,matplotlib等,但没有using R或其他外部工具)创建类似于下图的方法的方法。
dendogram http://www2.warwick.ac.uk/fac/sci/moac/currentstudents/peter_cock/r/heatmap/no_scaling.png
澄清
我被问到重新排序是什么意思。当您首先按矩阵行将数据聚类在矩阵中时,然后通过其列,每个矩阵单元可以通过两个树形图中的位置进行标识。如果对原始矩阵的行和列进行重新排序,使得在树形图中彼此靠近的元素在矩阵中彼此靠近,然后生成热图,则数据的聚类对于查看者来说可能变得明显(如上图所示)
答案 0 :(得分:41)
请参阅下面部分复制的recent answer this related question。
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 http://up.stevetjoa.com/dendrogram.png
答案 1 :(得分:5)
我不确定完全理解,但看起来你正试图根据树形图指标的种类重新索引数组的每个轴。我想这假设在每个分支描述中都有一些比较逻辑。如果是这种情况那么这将起作用(?):
>>> 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_idxs
和y_idxs
是树状图指示。 a
是未排序的矩阵。 xi
和yi
是您的新行/列数组标记。 a2
是排序矩阵,而x_idxs2
和y_idxs2
是新的,排序的树状图指标。这假设在创建树形图时,0
分支列/行总是比1
分支更大/更小。
如果您的y_idxs和x_idxs不是列表但是是numpy数组,那么您可以以类似的方式使用np.argsort
。
答案 2 :(得分:2)
我知道游戏已经很晚了,但我根据本页帖子中的代码制作了一个绘图对象。它是在pip上注册的,所以要安装你只需要打电话
pip install pydendroheatmap
在这里查看项目的github页面:https://github.com/themantalope/pydendroheatmap