我有一个相对较大的图,其中顶点数为524,边数为1125,包含真实世界的交易。这些边是有向的,具有权重(可选)。
我正在尝试探索图中的各种社区,并需要一种方法来:
- 计算所有可能的社区
- 计算最佳社区数量
- 返回每个(最佳)社区的成员/#成员
到目前为止,我已经成功编写了以下代码,可以绘制颜色编码图,对应不同的社区,但是我不知道如何控制社区的数量(即绘制具有最高成员资格的前5个社区)或列出特定社区的成员。
library(igraph)
edges <- read.csv('http://dl.dropbox.com/u/23776534/Facebook%20%5BEdges%5D.csv')
all<-graph.data.frame(edges)
summary(all)
all_eb <- edge.betweenness.community(all)
mods <- sapply(0:ecount(all), function(i) {
all2 <- delete.edges(all, all_eb$removed.edges[seq(length=i)])
cl <- clusters(all2)$membership
modularity(all, cl)
})
plot(mods, type="l")
all2<-delete.edges(all, all_eb$removed.edges[seq(length=which.max(mods)-1)])
V(all)$color=clusters(all2)$membership
all$layout <- layout.fruchterman.reingold(all,weight=V(all)$weigth)
plot(all, vertex.size=4, vertex.label=NA, vertex.frame.color="black", edge.color="grey",
edge.arrow.size=0.1,rescale=TRUE,vertex.label=NA, edge.width=.1,vertex.label.font=NA)
由于边介数法表现不佳,我试着再次使用走陷法方法:all_wt<- walktrap.community(all, steps=6,modularity=TRUE,labels=TRUE)
all_wt_memb <- community.to.membership(all, all_wt$merges, steps=which.max(all_wt$modularity)-1)
colbar <- rainbow(20)
col_wt<- colbar[all_wt_memb$membership+1]
l <- layout.fruchterman.reingold(all, niter=100)
plot(all, layout=l, vertex.size=3, vertex.color=col_wt, vertex.label=NA,edge.arrow.size=0.01,
main="Walktrap Method")
all_wt_memb$csize
[1] 176 13 204 24 9 263 16 2 8 4 12 8 9 19 15 3 6 2 1
19个聚类 - 进步明显!
现在假设我有一个“已知聚类”,其中包含其成员列表,并想检查每个观察到的聚类是否存在来自“已知聚类”的成员,返回找到的成员的百分比。无法完成以下任务?
list<-read.csv("http://dl.dropbox.com/u/23776534/knownlist.csv")
ength(all_wt_memb$csize) #19
for(i in 1:length(all_wt_memb$csize))
{
match((V(all)[all_wt_memb$membership== i]),list)
}
all
对象的代码吗?如果太大的话,至少提供一个小版本的代码也行。我很难重新创建这个问题。 - Jeff Allen