首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >igraph中社区检测后的社区成员提取(R)

igraph中社区检测后的社区成员提取(R)
EN

Stack Overflow用户
提问于 2019-09-20 05:17:20
回答 1查看 1.3K关注 0票数 1

igraph中运行社区检测算法后,我在提取社区成员时遇到了一些困难。存储的membership向量似乎与算法发现的社区成员身份不相对应。我怀疑我遗漏了一些东西,但是文档很薄,任何帮助都很感激。

我的例子:

创建一个包含三个社区和两个组件的加权图:

代码语言:javascript
复制
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)。事实上,当我们运行一个社区检测算法时,它会发现:

代码语言:javascript
复制
cd <- fastgreedy.community(g)
plot(cd,g, edge.width=weight)
str(cd)

给出输出:

代码语言:javascript
复制
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"`

这张很好的图被分成了几个社区。

然而,当我试图访问cd$membershipcutat()时,情况就不同了:

代码语言:javascript
复制
cd$membership
cutat(cd, steps=which.max(cd$modularity)-1)

双双给予

代码语言:javascript
复制
[1] 3 3 3 2 2 1 1 1 2

我是否错误地将上述解释解释为表示每个顶点的社区成员?似乎它是(正确的)分配(1,2,3)到社区3,但不正确地分组(4,5,9)和(6,7,8)在一起。

EN

回答 1

Stack Overflow用户

发布于 2019-09-20 09:29:42

看似不匹配的原因是igraph读取和分配顶点ids的顺序(参考参见这个答案 )。

让我们看看graph-object提供的顶点顺序:

代码语言:javascript
复制
> 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之后。这是删除重复条目后产生的顶点序列:

代码语言:javascript
复制
> unique(unlist(graph, use.names = F))
[1] 1 2 3 4 6 7 8 9 5

或者使用igraph

代码语言:javascript
复制
> V(g)
+ 9/9 vertices, named, from 3bae324:
[1] 1 2 3 4 6 7 8 9 5

它很好地与您的示例中的社区保持一致:

代码语言:javascript
复制
> 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 12所建议的那样,将成员关系指定为顶点属性:

代码语言:javascript
复制
V(g)$community <- membership(cd)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58022160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档