Matrix 排列矩阵的行和列以进行聚类

Matrix 排列矩阵的行和列以进行聚类,matrix,cluster-analysis,permutation,Matrix,Cluster Analysis,Permutation,我有一个尺寸为1000x1000的距离矩阵,沿对角线对称0。我想通过同时对矩阵的行和列重新排序来形成距离分组(簇)。这就像在使用热图可视化矩阵簇之前对矩阵重新排序。我觉得这应该是一个简单的问题,但我没有太多的运气找到代码,做排列在线。有人能帮忙吗?我想到了一种方法: “稀疏化”矩阵,以便只有“足够接近”的邻域在矩阵中具有非零值 使用a压缩稀疏矩阵的带宽 使用步骤2的结果对原始矩阵进行对称重新排序 例子 我将使用Octave(我正在做的所有事情都应该在Matlab中工作),因为它内置了一个反向Cu

我有一个尺寸为1000x1000的距离矩阵,沿对角线对称0。我想通过同时对矩阵的行和列重新排序来形成距离分组(簇)。这就像在使用热图可视化矩阵簇之前对矩阵重新排序。我觉得这应该是一个简单的问题,但我没有太多的运气找到代码,做排列在线。有人能帮忙吗?

我想到了一种方法:

  • “稀疏化”矩阵,以便只有“足够接近”的邻域在矩阵中具有非零值
  • 使用a压缩稀疏矩阵的带宽
  • 使用步骤2的结果对原始矩阵进行对称重新排序
  • 例子 我将使用Octave(我正在做的所有事情都应该在Matlab中工作),因为它内置了一个反向Cutchill-McKee(RCM)实现

    首先,我们需要生成一个距离矩阵。此函数创建一组随机点及其距离矩阵:

    function [x, y, A] = make_rand_dist_matrix(n)
      x = rand(n, 1);
      y = rand(n, 1);
      A = sqrt((repmat(x, 1, n) - repmat(x', n, 1)).^2 +
           (repmat(y, 1, n) - repmat(y', n, 1)).^2);
    end
    
    让我们用它来生成并可视化一个100点的示例

    [x, y, A] = make_rand_dist_matrix(100);
    surf(A);
    
    从上面查看曲面图可以得到下面的图像(当然,您的会有所不同)

    暖色比冷色代表更远的距离。矩阵中的行(或列,如果愿意)
    i
    包含点
    i
    和所有点之间的距离。点
    i
    和点
    j
    之间的距离在条目
    A(i,j)
    中。我们的目标是对矩阵进行重新排序,使点
    i
    对应的行靠近距离
    i
    较短的点对应的行

    稀疏
    A
    的一个简单方法是使所有条目大于某个阈值零,这就是下面要做的,尽管更复杂的方法可能更有效

    B = A < 0.2;   % sparsify A -- only values less than 0.2 are nonzeros in B
    p = symrcm(B); % compute reordering by Reverse Cuthill-McKee
    surf(A(p, p)); % visualize reordered distance matrix
    

    显然,连接无处不在,并且发生在各种各样的距离上

    B = A < 0.2;     % sparsify A
    p = symrcm(B);
    plot(x(p), y(p)) % plot the reordered points
    
    B=A<0.2;%稀疏的
    p=symrcm(B);
    绘图(x(p),y(p))%绘制重新排序的点
    


    重新排序后,连接的距离往往会小得多,顺序也会有序得多。

    两个Matlab函数可以做到这一点:和 .
    请注意,此问题没有唯一的解决方案。集群是另一种方法。

    这里的“在线”是什么意思?就集群而言,它通常意味着数据在进入时进行处理,而不是一次存储在内存中。但是你有一个1000x1000的矩阵,所以情况似乎不是这样。如果“在线”是指通过javascript在浏览器中,那么问题只是计算所有成对的行,分别。列相似性,然后是聚类。大卫的回答有效;另一个易于实现的算法(但得益于更为复杂和稀疏的实现)是马尔可夫聚类算法,它在生物信息学中被大量使用。@micans,他的意思是他不能在网上找到它。@cyborg你很可能是对的,这使我的评论有点可笑。不幸的是,用户439463似乎已经离开了对话。给出了很好的答案,两种可视化效果都非常好。
    B = A < 0.2;     % sparsify A
    p = symrcm(B);
    plot(x(p), y(p)) % plot the reordered points