首页 文章

重新排序矩阵元素以反映naiive python中的列和行聚类

提问于
浏览
26

我正在寻找一种在矩阵行上分别执行聚类的方法,而不是在其列上,重新排序矩阵中的数据以反映聚类并将它们放在一起 . 聚类问题很容易解决,树形图创建也是如此(例如在this blog"Programming collective intelligence"中) . 但是,如何重新排序数据仍然不清楚 .

最后,我正在寻找一种使用朴素Python创建类似于下图的方法(使用任何"standard"库,如numpy,matplotlib等,但没有using R或其他外部工具) .

dendogram http://www2.warwick.ac.uk/fac/sci/moac/currentstudents/peter_cock/r/heatmap/no_scaling.png

Clarifications

我被问到重新排序是什么意思 . 当您首先按矩阵行将数据聚类在矩阵中时,然后通过其列,每个矩阵单元可以通过两个树形图中的位置进行标识 . 如果重新排序原始矩阵的行和列,使得在树形图中彼此靠近的元素在矩阵中彼此靠近,然后生成热图,数据的聚类可能对观察者来说变得明显(如上图所示)

3 回答

  • 41

    我不确定完全理解,但似乎你试图根据树形图指标的种类重新索引数组的每个轴 . 我想这假设在每个分支描述中都有一些比较逻辑 . 如果是这种情况那么这将工作(?):

    >>> 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 是树状图指示 . a 是未排序的矩阵 . xiyi 是您的新行/列数组指示 . a2 是排序矩阵,而 x_idxs2y_idxs2 是新的,排序的树形图标记 . 这假设在创建树形图时, 0 分支列/行总是比 1 分支更大/更小 .

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

  • 2

    我知道现在游戏已经很晚了,但我根据本页帖子中的代码制作了一个绘图对象 . 它在pip上注册,所以要安装你只需要打电话

    pip install pydendroheatmap
    

    在这里查看项目的github页面:https://github.com/themantalope/pydendroheatmap

  • 5

    请参阅下面部分复制的recent answerthis 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

相关问题