如何比较两个连续图中的社区

时间:2014-04-24 07:56:06

标签: r graph-algorithm igraph

我有两个不同时间表示的相同图表,g.t0g.t1g.t1g.t0的区别在于有一条额外的边但保持相同的顶点。

我想比较g.t0g.t1中的社区,即测试顶点是否从t0移动到t1到另一个社区。我尝试了以下

library(igraph)

m <- matrix(c(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0),nrow=4,ncol=4)

g.t0 <- graph.adjacency(m)
memb.t0 <- membership(edge.betweenness.community(g.t0))
V(g.t0)
# Vertex sequence:
#   [1] 1 2 3 4
memb.t0
# [1] 1 2 2 3

g.t1 <- add.edges(g.t0,c(1,2))
memb.t1 <- membership(edge.betweenness.community(g.t1))
V(g.t1)
# Vertex sequence:
#   [1] 1 2 3 4
memb.t1
# [1] 1 1 1 2

但当然问题在于社区的索引总是从1开始。然后在示例中,似乎所有顶点都移动到了不同的社区,但最直观的读数是实际上只有顶点1发生了变化社区,以2和3移动。

我如何处理将社区从t0更改为t1的顶点数量计算问题?

1 个答案:

答案 0 :(得分:3)

实际上这不是一个简单的问题。通常,您需要使用匹配优化的一些规则或条件来匹配两个图中的社区。由于您可以拥有不同数量的社区,因此匹配不一定是双射的。

为这个问题提出了几种方法和数量,一堆是在igraph中实现的,请参阅 http://igraph.org/r/doc/compare.html

compare.communities(memb.t1, memb.t0, method="vi")
# [1] 0.4773856
compare.communities(memb.t1, memb.t0, method="nmi")
# [1] 0.7020169
compare.communities(memb.t1, memb.t0, method="rand")
# [1] 0.6666667

有关方法的详细信息,请参阅igraph手册中的参考资料。