r - 如何通过 1000 x 1000 获得二进制/邻接矩阵的鸟瞰图?
问题描述
我目前有一个 1000x1000 的邻接矩阵。我正在尝试查看整个数据中是否存在“集群”。例如,如果我假设将其打印在一张足够小的 0 和 1 的纸上,那么我们可以看到 1 会聚集的模式。
我想知道在 R 中是否有办法做到这一点,或者通过将整个矩阵缩小到一个足够小的网格来读取,或者像热图这样的可视化方法。我对热图很警惕,因为它似乎使用相似性度量来计算事物。相反,我只想鸟瞰0 和 1 可能聚集的位置。
我拥有的数据本质上是由igraph
R 通过随机块模型函数创建的邻接矩阵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 个组是否真的出现集群?
解决方案
正如您之前的问题一样,
heatmap
应该为此工作。我认为您对结果不满意的原因是您生成图表的方式。热图将显示这一点。
使用矩阵 A,您可以制作热图:
heatmap(A, Rowv=NA, Colv=NA, col=terrain.colors(16),
labRow=FALSE, labCol=FALSE, revC=TRUE)
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)
这开始显示正在发生的事情,但这不是我认为你想要的。但这是基于您制作偏好矩阵的方式。
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)
现在有沿对角线形成的组。
推荐阅读
- java - 本地 Pubsub 模拟器不适用于 Dataflow
- powershell - Add-LocalGroupMember 在 windows server 2012 上未被识别为 cmdlet、函数、脚本或文件
- image-processing - ImageNet 分类:np.testing.assert_almost_equal(pred_probas.sum().asscalar(), 1, decimal=5)
- php - 获取 SSL 证书颁发者/主题的 PHP 正则表达式
- python - MySQLInterfaceError:无法转换 Python 类型列表
- java - Java泛型 - 不兼容的等式约束
- git - libgit2sharp usernamepasswordcredentials 似乎忽略了用户名?
- python - 我如何减去 django 中的时间日期来确定帖子的年龄?
- simulation - 在 AnyLogic 中使用代理名称作为 selectOutput 的条件
- javascript - 合并两个 JavaScript 对象和冲突的属性