Sea*_* Mc 9 modularity r igraph
我有一个相对较大的顶点图: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)
Run Code Online (Sandbox Code Playgroud)
因为边缘介于中间方法执行得很差,我再次使用walktrap方法尝试:
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
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
通过仔细查看您正在使用的函数的文档,可以发现其中的几个问题.例如,clusters"值"部分中的文档描述了从函数返回的内容,其中一些内容可以回答您的问题.除了文档之外,您始终可以使用该str函数来分析任何特定对象的构成.
话虽这么说,为了获得特定社区中的成员或成员数量,您可以查看该membership函数返回的对象clusters(您已经使用该对象来指定颜色).所以类似于:
summary(clusters(all2)$membership)
Run Code Online (Sandbox Code Playgroud)
将描述正在使用的集群的ID.对于样本数据,看起来您拥有ID范围为0到585的群集,总共586个群集.(请注意,您将无法使用当前使用的着色方案非常准确地显示这些.)
要确定每个群集中的顶点数,您可以查看csize也返回的组件clusters.在这种情况下,它是一个长度为586的向量,为每个计算的簇存储一个大小.所以你可以使用
clusters(all2)$csize
Run Code Online (Sandbox Code Playgroud)
获取群集大小的列表.请注意,如前所述,您的clusterID从0("零索引")开始,而R向量从1开始("一个索引"),因此您需要将这些索引换一.例如,clusters(all2)$csize[5]返回ID为4的集群大小.
要列出任何群集中的顶点,您只需要查找membership前面提到的组件中的哪些ID 与相关群集匹配.因此,如果我想在群集#128(根据其中有21个)中找到顶点clusters(all2)$csize[129],我可以使用:
which(clusters(all2)$membership == 128)
length(which(clusters(all2)$membership == 128)) #21
Run Code Online (Sandbox Code Playgroud)
并且要检索该集群中的顶点,我可以使用该V函数并传入我刚刚计算的索引,这些索引是该集群的成员:
> V(all2)[clusters(all2)$membership == 128]
Vertex sequence:
[1] "625591221 - Clare Clancy"
[2] "100000283016052 - Podge Mooney"
[3] "100000036003966 - Jennifer Cleary"
[4] "100000248002190 - Sarah Dowd"
[5] "100001269231766 - LirChild Surfwear"
[6] "100000112732723 - Stephen Howard"
[7] "100000136545396 - Ciaran O Hanlon"
[8] "1666181940 - Evion Grizewald"
[9] "100000079324233 - Johanna Delaney"
[10] "100000097126561 - Órlaith Murphy"
[11] "100000130390840 - Julieann Evans"
[12] "100000216769732 - Steffan Ashe"
[13] "100000245018012 - Tom Feehan"
[14] "100000004970313 - Rob Sheahan"
[15] "1841747558 - Laura Comber"
[16] "1846686377 - Karen Ni Fhailliun"
[17] "100000312579635 - Anne Rutherford"
[18] "100000572764945 - Lit ? Jsociety"
[19] "100003033618584 - Fall Ball"
[20] "100000293776067 - James O'Sullivan"
[21] "100000104657411 - David Conway"
Run Code Online (Sandbox Code Playgroud)
这将涵盖您所拥有的基本igraph问题.其他问题更多与图论相关.我不知道如何监督使用iGraph创建的集群数量,但是有人可能会指出一个能够做到这一点的软件包.您可以在此处或在其他场所将更多成功发布为单独的问题.
关于你想要遍历所有可能的社区的第一点,我想你会发现对于一个显着大小的图表是不可行的.membership5个不同聚类的向量的可能排列的数量将是5 ^ n,其中n是图的大小.如果你想找到"所有可能的社区",那么这个数字实际上是O(n ^ n),如果我的心理数学是正确的.从本质上讲,即使给出了大量的计算资源,也无法在任何合理大小的网络上进行详尽的计算.因此,我认为您最好使用某种智能/优化来确定图中所代表的社区数量,就像clusters函数一样.