【发布时间】:2018-09-24 20:47:06
【问题描述】:
我有一个分数相关矩阵,我想在 R 中使用 igraph 中的 Louvain 方法运行社区检测。我使用 cor2dist 将相关矩阵转换为距离矩阵,如下所示:
distancematrix <- cor2dist(correlationmatrix)
这给出了一个 400 x 400 的距离矩阵,从 0 到 2。然后,我使用http://kateto.net/networks-r-igraph(第 3.1 节)中的以下方法列出了边(距离)和顶点(400 个人中的每一个)。
library(igraph)
test <- as.matrix(distancematrix)
mode(test) <- "numeric"
test2 <- graph.adjacency(test, mode = "undirected", weighted = TRUE, diag = TRUE)
E(test2)$weight
get.edgelist(test2)
然后我写了 'from' 和 'to' 边缘列表的 csv 文件,以及相应的权重:
edgeweights <-E(test2)$weight
write.csv(edgeweights, file = "edgeweights.csv")
fromtolist <- get.edgelist(test2)
write.csv(fromtolist, file = "fromtolist.csv")
从这两个文件中,我生成了一个名为“nodes.csv”的 .csv 文件,其中包含 400 个人的所有顶点 ID:
id
1
2
3
4
...
400
还有一个名为“edges.csv”的 .csv 文件,其中详细说明了每个节点之间的“从”和“到”,并提供了每个边的权重(即距离度量):
from to weight
1 2 0.99
1 3 1.20
1 4 1.48
...
399 400 0.70
然后我尝试使用这个节点和边列表来创建一个 igraph 对象,并按以下方式运行 louvain 集群:
nodes <- read.csv("nodes.csv", header = TRUE, as.is = TRUE)
edges <- read.csv("edges.csv", header = TRUE, as.is = TRUE)
clustergraph <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)
clusterlouvain <- cluster_louvain(clustergraph)
很遗憾,这并没有正确进行 louvain 社区检测。我预计这会返回大约 2-4 个不同的社区,它们的绘制可能类似于 here,但 sizes(clusterlouvain) 返回:
Community sizes
1
400
表示所有个体都被归入同一个社区。集群也立即运行(即几乎没有计算时间),这也让我认为它工作不正常。
我的问题是: 谁能指出为什么 cluster_louvain 方法不起作用并且只识别了一个社区?我想我一定是错误地指定了距离矩阵或边/节点,或者以其他方式没有为 cluster_louvain 方法提供正确的输入。我对 R 比较陌生,因此非常感谢您提供任何建议。我已经成功地在识别 2-3 个社区的同一距离矩阵(即 k-means)上使用了其他社区检测方法,但想了解我在这里做错了什么。
我知道还有多个关于在 R 中使用 igraph 的其他查询,但我还没有找到一个明确指定边和节点的输入格式(来自相关矩阵)以使 louvain 社区检测正常工作的查询。
感谢您的任何建议!如果有帮助,我可以提供更多信息。
【问题讨论】:
标签: r cluster-analysis igraph