igraph中加权图的模块性计算

3
我在一个加权、无向图中使用igraph的fastgreedy算法进行社区检测。之后我想查看模块度,但不同方法得到了不同的值,我想知道原因。下面是一个简短的例子,展示了我的问题:
library(igraph)
d<-matrix(c(1, 0.2, 0.3, 0.9, 0.9,   
            0.2, 1, 0.6, 0.4, 0.5,  
            0.3, 0.6, 1, 0.1, 0.8,  
            0.9, 0.4, 0.1, 1, 0.5,  
            0.9, 0.5, 0.8, 0.5, 1), byrow=T, nrow=5)    

g<-graph.adjacency(d, weighted=T, mode="lower",diag=FALSE, add.colnames=NA)
fc<-fastgreedy.community(g)

fc$modularity[3]
#[1] -0.05011095
modularity(g,membership=cutat(fc,steps=2),weights=get.adjacency(g,attr="weight"))
#[1] 0.07193047

我希望两个值是相同的,并且如果我尝试使用未加权图表执行相同操作,我将获得相同的值。
d2<-round(d,digits=0)
g2<- graph.adjacency(d2, weighted=NULL, mode="lower",diag=FALSE, add.colnames=NA)
fc2<-fastgreedy.community(g2)
plot(fc2,g2)

fc2$modularity[3]
#[1] 0.15625
modularity(g2,membership=cutat(fc2,steps=2))
#[1] 0.15625

另一位用户遇到了类似的问题,但我已经有了当前版本的igraph,所以这不应该是问题。有人能解释一下为什么会有差异吗?还是我的代码有问题,我没有发现?

1个回答

6

这条线

modularity(g,membership=cutat(fc,steps=2),weights=get.adjacency(g,attr="weight"))

出现错误了。如果您想将边的权重传递给modularity(),请使用E(g)$weight

modularity(g, membership = cutat(fc, steps = 2), weights = E(g)$weight)
# [1] -0.05011095

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接