如何在igraph(R)社区检测后找到措施?

shu*_*l92 6 r igraph

我正在使用图表中的社区检测.我已经通过igraph中实现的不同社区检测算法和绘制社区结构.现在,在获得不同算法的社区对象之后,我想基于密度,切割比,覆盖率等不同度量来比较算法.(我知道模块化已经实现).我可以获得一个子图,然后计算簇内密度,但要找到簇间密度,我不知道如何继续.这是我用来查找群集内密度的代码:

karate <- graph.famous("Zachary")
wckarate <- walktrap.community(karate) #any algorithm
subg1<-induced.subgraph(karate, which(membership(wckarate)==1)) #membership id differs for each cluster
intradensity1 <- ecount(subg1)/ecount(karate) #for each cluster
Run Code Online (Sandbox Code Playgroud)

同样地,我可以继续每个集群并添加所有密度或取所有密度的平均值.我的问题是,如果社区数量非常大,那么如何进行?

如果我想提取不同社区之间的边数,有没有一种很好的方法来提取边数?

如果已经提出这个问题,请原谅我.我是igraph和R的新手

MrF*_*ick 7

好吧,我们可以调整你的代码来循环不同的子组

karate <- graph.famous("Zachary")
wckarate <- walktrap.community(karate) #any algorithm
sapply(unique(membership(wckarate)), function(g) {
    subg1<-induced.subgraph(karate, which(membership(wckarate)==g)) #membership id differs for each cluster
    ecount(subg1)/ecount(karate)
})
Run Code Online (Sandbox Code Playgroud)

至于获得社区之间的优势,你可以做到

#get all combinations of communities
cs <- data.frame(combn(unique(membership(wckarate)),2))
cx <- sapply(cs, function(x) {
    es<-E(karate)[V(karate)[membership(wckarate)==x[1]] %--% 
              V(karate)[membership(wckarate)==x[2]]]    
    length(es)
})
cbind(t(cs),cx)
Run Code Online (Sandbox Code Playgroud)

您也可以绘制社区,以确保看起来合理

plot.communities(wckarate, karate)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述