首页 > 解决方案 > 如何通过 1000 x 1000 获得二进制/邻接矩阵的鸟瞰图?

问题描述

我目前有一个 1000x1000 的邻接矩阵。我正在尝试查看整个数据中是否存在“集群”。例如,如果我假设将其打印在一张足够小的 0 和 1 的纸上,那么我们可以看到 1 会聚集的模式。

我想知道在 R 中是否有办法做到这一点,或者通过将整个矩阵缩小到一个足够小的网格来读取,或者像热图这样的可视化方法。我对热图很警惕,因为它似乎使用相似性度量来计算事物。相反,我只想鸟瞰0 和 1 可能聚集的位置。

我拥有的数据本质上是由igraphR 通过随机块模型函数创建的邻接矩阵sample_sbm。它包含 1000 个节点,有 100 个社区。一个可重现的例子如下:

library(igraph)
pref.matrix <- matrix(rep(0.07, 100*100), ncol = 100)
diag(pref.matrix) <- rep(0.01, 100)
g <- sample_sbm(1000, pref.matrix = pref.matrix, block.sizes = rep(10, 100))
A <- as.matrix(as_adj(g))  # The adjacency matrix of 1000 by 1000

我想知道如何获得这个矩阵的可视化,以便我可以看到 100 个组是否真的出现集群?

标签: r

解决方案


正如您之前的问题一样, heatmap应该为此工作。我认为您对结果不满意的原因是您生成图表的方式。热图将显示这一点。

使用矩阵 A,您可以制作热图:

heatmap(A, Rowv=NA, Colv=NA, col=terrain.colors(16),
    labRow=FALSE, labCol=FALSE, revC=TRUE)

热图01

1000 x 1000 的图像太大,看不清细节,所以我将左上角放大——前 10 组,每组 10 个。

heatmap(A[1:100, 1:100], Rowv=NA, Colv=NA, col=terrain.colors(16),
    labRow=FALSE, labCol=FALSE, revC=TRUE)

热图02

这开始显示正在发生的事情,但这不是我认为你想要的。但这是基于您制作偏好矩阵的方式。

pref.matrix <- matrix(rep(0.07, 100*100), ncol = 100)
diag(pref.matrix) <- rep(0.01, 100)

您从所有条目开始为 0.07 - 即任何组之间连接的概率相当低。然后你改变对角线并将其设置为 0.01 - 相当低。您要求的是任何两个不同组连接的可能性很小,并且节点连接到同一组内的节点的可能性非常小。我怀疑这不是你想要的。如果您在某个组中取一个点,则连接到其组外的所有点的概率是相等的 - 这不应该创建任何集群。但是在点的组内被连接的概率较低。那里也没有集群。我认为你想要的是它应该 更有可能一个点连接到其组内的一个点,而不是连接到另一个组。

所以也许你需要这样的东西:

pref.matrix <- matrix(rep(0.04, 100*100), ncol = 100)
diag(pref.matrix) <- rep(0.4, 100)
g2 <- sample_sbm(1000, pref.matrix = pref.matrix, block.sizes = rep(10, 100))
A2 <- as.matrix(as_adj(g2)) 

这使得一个点更有可能连接到它自己的组而不是另一个组。您可以在放大的热图中看到这一点。

heatmap(A2[1:100, 1:100], Rowv=NA, Colv=NA, col=terrain.colors(16),
    labRow=FALSE, labCol=FALSE, revC=TRUE)

热图04

现在有沿对角线形成的组。


推荐阅读