Gil*_*709 3 modularity igraph weighted
我将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
Run Code Online (Sandbox Code Playgroud)
我希望两个值都相同,并且如果我尝试对非加权图进行相同操作,则将获得相同的值。
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
Run Code Online (Sandbox Code Playgroud)
另一个用户也有类似的问题,但是我有igraph的当前版本,所以应该不是问题。有人可以向我解释为什么我看不到我的代码有区别吗?
线
modularity(g,membership=cutat(fc,steps=2),weights=get.adjacency(g,attr="weight"))
Run Code Online (Sandbox Code Playgroud)
是错的。如果要将边缘的权重传递给modularity(),请执行以下操作E(g)$weight:
modularity(g, membership = cutat(fc, steps = 2), weights = E(g)$weight)
# [1] -0.05011095
Run Code Online (Sandbox Code Playgroud)