9

実世界のトランザクションの頂点: 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)

エッジの中間性メソッドのパフォーマンスが非常に悪かったため、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

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)

}  
4

2 に答える 2

5

これらの質問のいくつかは、使用している関数のドキュメントをよく見ることで発見できます。たとえば、 のドキュメントのclusters「値」セクションでは、関数から何が返されるかについて説明されており、そのうちのいくつかが質問に答えています。ドキュメンテーションは別として、いつでもstr関数を使用して、特定のオブジェクトの構成を分析できます。

そうは言っても、特定のコミュニティのメンバーまたはメンバー数を取得するにはmembership、関数によって返されたオブジェクトを調べることができclustersます (既に色を割り当てるために使用しています)。次のようなものです:

summary(clusters(all2)$membership)

使用されているクラスターの ID を記述します。サンプル データの場合、0 から 585 までの範囲の ID を持つクラスターがあり、合計で 586 個のクラスターがあるように見えます。(現在使用しているカラーリング スキームを使用してこれらを正確に表示することはできないことに注意してください。)

csize各クラスタ内の頂点の数を決定するには、によっても返されるコンポーネントを確認できますclusters。この場合、これは長さ 586 のベクトルであり、計算されたクラスターごとに 1 つのサイズを格納します。だからあなたが使うことができます

clusters(all2)$csize

クラスターのサイズのリストを取得します。前述のように、clusterID は 0 (「ゼロ インデックス」) から始まるのに対し、R ベクトルは 1 (「1 インデックス」) から始まることに注意してください。したがって、これらのインデックスを 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

そのクラスター内の頂点を取得するには、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"

それはあなたが持っていた基本的なigraphの質問をカバーするでしょう. 他の質問は、グラフ理論に関連しています。iGraph を使用して作成されるクラスターの数を監視する方法はわかりませんが、それができるパッケージを誰かが教えてくれるかもしれません。ここまたは別の場所で別の質問として投稿すると、より成功する可能性があります。

考えられるすべてのコミュニティを繰り返し処理したいという最初のポイントについては、かなりのサイズのグラフでは実行不可能であることがわかると思います。5 つの異なるクラスターのベクトルの可能な配置の数は、membership5^n になります。ここで、n はグラフのサイズです。「すべての可能なコミュニティ」を見つけたい場合、私の暗算が正しければ、その数は実際には O(n^n) になります。基本的に、膨大な計算リソースが与えられたとしても、妥当なサイズのネットワークでこれを徹底的に計算することは不可能です。clustersしたがって、関数が行うように、グラフで表されるコミュニティの数を決定するために、ある種のインテリジェンス/最適化を使用する方がよいと思います。

于 2012-03-27T16:05:03.207 に答える
1

OPの質問の「コミュニティの数を制御する方法」に関して、コミュニティでcut_at関数を使用して、結果の階層構造を目的の数のグループにカットします。私が正気なことをしていることを誰かが確認してくれることを願っています。つまり、次のことを考慮してください。

#Generate graph
adj.mat<- matrix(,nrow=200, ncol=200) #empty matrix
set.seed(2) 

##populate adjacency matrix
for(i in 1:200){adj.mat[i,sample(rep(1:200), runif(1,1,100))]<-1}
adj.mat[which(is.na(adj.mat))] <-0

for(i in 1:200){
  adj.mat[i,i]<-0
}

G<-graph.adjacency(adj.mat, mode='undirected')
plot(G, vertex.label=NA)

##Find clusters
walktrap.comms<- cluster_walktrap(G, steps=10)
max(walktrap.comms$membership) #43

  [1]  6 34 13  1 19 19  3  9 20 29 12 26  9 28  9  9  2 14 13 14 27  9 33 17 22 23 23 10 17 31  9 21  2  1
 [35] 33 23  3 26 22 29  4 16 24 22 25 31 23 23 13 30 35 27 25 15  6 14  9  2 16  7 23  4 18 10 10 22 27 27
 [69] 23 31 27 32 36  8 23  6 23 14 19 22 19 37 27  6 27 22  9 14  4 22 14 32 33 27 26 14 21 27 22 12 20  7
[103] 14 26 38 39 26  3 14 23 22 14 40  9  5 19 29 31 26 26  2 19  6  9  1  9 23  4 14 11  9 22 23 41 10 27
[137] 22 18 26 14  8 15 27 10  5 33 21 28 23 22 13  1 22 24 14 18  8  2 18  1 27 12 22 34 13 27  3  5 27 25
[171]  1 27 13 34  8 10 13  5 17 17 25  6 19 42 31 13 30 32 15 30  5 11  9 25  6 33 18 33 43 10

さて、43 のグループがあることに注意してください。

plot(as.hclust(walktrap.comms), label=F)

そしてそれを元にカット。私は任意に 6 カットを選択しましたが、それにもかかわらず、クラスターが粗くなりました。

cut_at(walktrap.comms, no=6)

  [1] 4 2 5 4 5 5 3 5 3 4 3 5 5 3 5 5 3 1 5 1 1 5 1 6 1 1 1 4 6 5 5 2 3 4 1 1 3 5 1 4 6 6 3 1 5 5 1 1 5 4 3 1
 [53] 5 2 4 1 5 3 6 3 1 6 6 4 4 1 1 1 1 5 1 4 3 3 1 4 1 1 5 1 5 2 1 4 1 1 5 1 6 1 1 4 1 1 5 1 2 1 1 3 3 3 1 5
[105] 3 3 5 3 1 1 1 1 3 5 2 5 4 5 5 5 3 5 4 5 4 5 1 6 1 3 5 1 1 1 4 1 1 6 5 1 3 2 1 4 2 1 2 3 1 1 5 4 1 3 1 6
[157] 3 3 6 4 1 3 1 2 5 1 3 2 1 5 4 1 5 2 3 4 5 2 6 6 5 4 5 3 5 5 4 4 2 4 2 3 5 5 4 1 6 1 2 4
于 2015-12-30T22:25:09.130 に答える