在Giggraph(R)中提取社区检测后的社区成员 [英] extract community membership after community detection in igraph (R)
本文介绍了在Giggraph(R)中提取社区检测后的社区成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在igraph
中运行社区检测算法后,提取社区成员身份时遇到一些问题。存储的membership
向量似乎与算法找到的社区成员身份不对应。我怀疑我遗漏了什么,但文档很少,感谢您的帮助。
我的例子:
创建包含三个社区和两个组件的加权图:
v1 <- c(1,1,2,3,4,4,6,7,8,9)
v2 <- c(2,3,3,4,5,6,5,8,9,7)
weight <- c(3,3,2,1,3,3,2,2,2,3)
graph <- data.frame(v1,v2)
g <- graph.data.frame(graph, directed=FALSE)
上图中的社区是顶点(1,2,3)、(4,5,6)和(7,8,9)。事实上,当我们运行社区检测算法时,它会发现:
cd <- fastgreedy.community(g)
plot(cd,g, edge.width=weight)
str(cd)
给出输出:
IGRAPH clustering fast greedy, groups: 3, mod: 0.56
groups:
1
[1] "7" "8" "9"
2
[1] "4" "6" "5"
3
[1] "1" "2" "3"`
and this nice picture of the graph split up into communities.
但是,当我尝试访问cd$membership
或cutat()
时,情况就不同了:
cd$membership
cutat(cd, steps=which.max(cd$modularity)-1)
两者都给
[1] 3 3 3 2 2 1 1 1 2
将上述解释为指示每个顶点的社区成员身份是错误的吗?它似乎(正确地)将(1,2,3)分配给社区3,但错误地将(4,5,9)和(6,7,8)分组在一起。
推荐答案
看似不匹配源于igraph
读取和分配顶点ID的顺序(有关参考,请参阅this answer)。
让我们看一下graph
-Object:
> unlist(graph, use.names = F) # identical to c(v1, v2)
[1] 1 1 2 3 4 4 6 7 8 9 2 3 3 4 5 6 5 8 9 7
在此序列中,5
仅在1,2,3,4,6,7,8,9
之后出现。这是删除重复条目后得到的顶点序列:
> unique(unlist(graph, use.names = F))
[1] 1 2 3 4 6 7 8 9 5
或使用igraph
:
> V(g)
+ 9/9 vertices, named, from 3bae324:
[1] 1 2 3 4 6 7 8 9 5
这与您的示例中找到的社区非常吻合:
> sort(membership(cd))
7 8 9 4 6 5 1 2 3 # vertex name
1 1 1 2 2 2 3 3 3 # community
由于序列匹配,您可以将成员分配为顶点属性,如下所示(由@chinsoon12建议):
V(g)$community <- membership(cd)
这篇关于在Giggraph(R)中提取社区检测后的社区成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文