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