Расчет модульности для взвешенных графов в igraph

Я использовал алгоритм fastgreedy в igraph для обнаружения своего сообщества во взвешенном неориентированном графе. Впоследствии я хотел взглянуть на модульность, и я получил разные значения для разных методов, и мне интересно, почему. Я включил короткий пример, демонстрирующий мою проблему:

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, так что это не должно быть проблемой. Может кто-нибудь объяснить мне, почему есть разница или есть проблема с моим кодом, которую я не вижу?


person Gilean0709    schedule 13.08.2014    source источник


Ответы (1)


Линия

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
person Gabor Csardi    schedule 13.08.2014