繁体   English   中英

使用igraph的R中的Louvain社区检测-边和顶点的格式

[英]Louvain community detection in R using igraph - format of edges and vertices

我有一个分数的相关矩阵,我想在R中使用igraph中的Louvain方法对社区进行检测。我使用cor2dist将相关矩阵转换为距离矩阵,如下所示:

distancematrix <- cor2dist(correlationmatrix)

这给出了从0-2到400的距离矩阵。 然后,我使用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对象,并以以下方式运行鲁汶群集:

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)

不幸的是,这不能正确地进行鲁瓦因社区检测。 我希望这能返回大约2-4个不同的社区,可以将其绘制成与此处相似的图形,但返回sizes(clusterlouvain)

Community sizes
 1 
 400

表示所有个人都被归入同一个社区。 集群也立即运行(即几乎没有计算时间),这也让我认为集群运行不正常。

我的问题是:有人可以建议为什么cluster_louvain方法不起作用并且只能识别一个社区吗? 我认为我必须错误地指定距离矩阵或边/节点,或者以其他方式未给cluster_louvain方法提供正确的输入。 我对R还是比较陌生,因此非常感谢您提供任何建议。 我已经在相同的距离矩阵(即k均值)上成功使用了其他的社区检测方法,该方法确定了2-3个社区,但想了解我在这里做错了什么。

我知道还有很多关于在R中使用igraph的查询,但是我还没有找到一个明确指定边缘和节点(从相关矩阵中)的输入格式以使百叶窗式社区检测正常工作的查询。

感谢您的任何建议! 如果有帮助,我可以提供更多信息。

我相信cluster_louvain确实可以对您的数据进行处理。 问题是您的图形。您的代码包含get.edgelist(test2) 那必须产生很多输出。 而是尝试一下

vcount(test2)
ecount(test2)

既然您说您的相关矩阵是400x400,所以我希望您会得到vcount给400和ecount给79800 = 400 * 399/2的方法。构造好之后, 每个节点都直接连接到所有其他节点 当然,只有一个大社区。

我怀疑您要执行的操作是相关的组变量。 如果相关性接近零,则变量应未连接。 似乎不太清楚的是如何处理相关性接近-1的变量。 是否要连接它们? 无论哪种方式,我们都可以做到。

您没有提供任何数据,因此我将用mlbench软件包中的电离层数据进行mlbench 我将尽力模仿您的代码,但会更改一些变量名。 同样,出于我的目的,将边缘写入文件然后再次读回它们是没有意义的,因此我将直接使用构造的边缘。

首先,假设您关联相关性接近-1的变量。

library(igraph)
library(mlbench)    # for Ionosphere data
library(psych)      # for cor2dist
data(Ionosphere)

correlationmatrix = cor(Ionosphere[, which(sapply(Ionosphere, class) == 'numeric')])
distancematrix <- cor2dist(correlationmatrix)

DM1 <- as.matrix(distancematrix)
## Zero out connections where there is low (absolute) correlation
## Keeps connection for cor ~ -1
## You may wish to choose a different threshhold
DM1[abs(correlationmatrix) < 0.33] = 0

G1 <- graph.adjacency(DM1, mode = "undirected", weighted = TRUE, diag = TRUE)
vcount(G1)
[1] 32
ecount(G1)
[1] 140

没有完全连接的图! 现在让我们找到社区。

clusterlouvain <- cluster_louvain(G1)
plot(G1, vertex.color=rainbow(3, alpha=0.6)[clusterlouvain$membership])

社区1

相反,如果您不希望连接负相关的变量,则只需摆脱上面的绝对值即可。 这应该少连接

DM2 <- as.matrix(distancematrix)
## Zero out connections where there is low correlation
DM2[correlationmatrix < 0.33] = 0

G2 <- graph.adjacency(DM2, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain <- cluster_louvain(G2)
plot(G2, vertex.color=rainbow(4, alpha=0.6)[clusterlouvain$membership])

社区2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM