2012-03-26 8 views
9

मेरे पास वर्टिसेस के साथ अपेक्षाकृत बड़ा ग्राफ है: वास्तविक दुनिया लेनदेन के 524 एज: 1125। किनारों को निर्देशित किया जाता है और वजन होता है (समावेशन वैकल्पिक है)। मैं ग्राफ के भीतर विभिन्न समुदायों की जांच कोशिश कर रहा हूँ और अनिवार्य रूप से एक विधि की जरूरत है जो:आर: igraph, सामुदायिक पहचान, एज.बेटविनेस विधि, प्रत्येक समुदाय के गिनती/सूची सदस्य?

-Calculates सभी संभव समुदायों

-Calculates समुदायों

का इष्टतम संख्या

-Returns के सदस्यों/# प्रत्येक (इष्टतम) समुदाय के सदस्य

अब तक मैं निम्नलिखित कोड को एक साथ खींचने में कामयाब रहा हूं जो विभिन्न समुदायों के अनुरूप रंग कोडित ग्राफ को प्लॉट करता है, हालांकि मुझे नहीं पता कि समुदायों की संख्या को नियंत्रित करने के लिए कैसे (यानी एच के साथ शीर्ष 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) 

क्योंकि बढ़त betweenness विधि इतना खराब प्रदर्शन किया मैं फिर से 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) 

} 
+0

क्या आप 'ऑल' ऑब्जेक्ट बनाने के लिए भी कोड प्रदान कर सकते हैं? या, यदि यह बहुत बड़ा है, तो कम से कम इसका कुछ छोटा संस्करण? मुझे इस मुद्दे को फिर से बनाने में कठिनाई हो रही है। –

+0

@ जेफएलेन, माफ़ी ने कुछ नमूना फेसबुक डेटा जोड़ा, वास्तव में जिस डेटा पर मैं काम कर रहा हूं वह ~ 50 गुना आकार है .. धन्यवाद –

+0

@ जेफअलेन, धन्यवाद एक लाख जो बहुत मददगार था। आप देखेंगे कि मैंने बेहतर प्रदर्शन के लिए ऊपर समुदाय पहचान विधि बदल दी है। इस बारे में कोई सुझाव कि मैं अपनी मिलान की समस्या को कैसे हल कर सकता हूं? –

उत्तर

5

इनमें से कुछ प्रश्नों का उपयोग आपके द्वारा उपयोग किए जा रहे कार्यों के दस्तावेज़ीकरण को बारीकी से देखकर किया जा सकता है। उदाहरण के लिए, "मान" खंड में clusters का दस्तावेज़, वर्णन करता है कि फ़ंक्शन से क्या वापस किया जाएगा, जिनमें से कुछ आपके प्रश्नों का उत्तर देते हैं। दस्तावेज़ीकरण एक तरफ, आप किसी भी विशेष वस्तु के मेक-अप का विश्लेषण करने के लिए हमेशा str फ़ंक्शन का उपयोग कर सकते हैं।

कहा जा रहा है कि किसी विशेष समुदाय में सदस्यों या सदस्यों की संख्या प्राप्त करने के लिए, आप membership ऑब्जेक्ट clusters फ़ंक्शन (जिसे आप रंग निर्दिष्ट करने के लिए पहले ही उपयोग कर रहे हैं) द्वारा लौटाए गए ऑब्जेक्ट को देख सकते हैं। तो कुछ ऐसा:

summary(clusters(all2)$membership) 

उपयोग किए जा रहे क्लस्टर की आईडी का वर्णन करेगा। आपके नमूना डेटा के मामले में, ऐसा लगता है कि कुल मिलाकर 586 क्लस्टर के लिए 0 से 585 तक की आईडी वाली क्लस्टर हैं। (ध्यान दें कि आप रंग योजना आप वर्तमान में उपयोग कर रहे हैं का उपयोग कर बहुत सही ढंग से उन प्रदर्शित करने के लिए सक्षम नहीं होगा।)

प्रत्येक क्लस्टर में कोने की संख्या का निर्धारण करने के लिए, आप csize घटक भी clusters द्वारा वापस देख सकते हैं । इस मामले में, यह लंबाई 586 का एक वेक्टर है, प्रत्येक क्लस्टर की गणना के लिए एक आकार संग्रहित करता है। तो आप अपने क्लस्टर के आकार की सूची प्राप्त करने के लिए

clusters(all2)$csize 

का उपयोग कर सकते हैं। चेतावनी दीजिये कि आपके क्लस्टर आईडी, जैसा कि पहले उल्लेख किया गया है, 0 से शुरू होता है ("शून्य-अनुक्रमित") जबकि आर वैक्टर 1 ("एक अनुक्रमित") से शुरू होते हैं, इसलिए आपको इन इंडेक्स को एक से बदलना होगा। उदाहरण के लिए, clusters(all2)$csize[5] क्लस्टर का आकार 4 की आईडी के साथ देता है।

किसी भी क्लस्टर में शीर्षकों को सूचीबद्ध करने के लिए, आप बस membership घटक में कौन से आईडी को प्रश्न में क्लस्टर तक मिलान करते हैं, यह पता लगाना चाहते हैं। तो अगर मैं क्लस्टर # 128 में कोने लगाना चाहते हैं (वहाँ clusters(all2)$csize[129] के अनुसार, इनमें से 21 कर रहे हैं), मैं इस्तेमाल कर सकते हैं:

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 अलग-अलग क्लस्टर के लिए membership वेक्टर की संभावित व्यवस्था की संख्या 5^एन होगी, जहां एन ग्राफ का आकार होगा। यदि आप "सभी संभावित समुदायों" को ढूंढना चाहते हैं, तो यह संख्या वास्तव में ओ (एन^एन) होगी, अगर मेरा मानसिक गणित सही है। अनिवार्य रूप से, किसी भी उचित आकार नेटवर्क पर व्यापक रूप से गणना करना असंभव होगा, यहां तक ​​कि बड़े पैमाने पर कम्प्यूटेशनल संसाधन भी दिए गए हैं। इसलिए मुझे लगता है कि clusters फ़ंक्शन के रूप में आपके ग्राफ़ में प्रतिनिधित्व किए गए समुदायों की संख्या निर्धारित करने के लिए आप किसी प्रकार की खुफिया/अनुकूलन का उपयोग करना बेहतर कर देंगे।

0

ओपीएस प्रश्न में "समुदायों की संख्या को नियंत्रित करने के तरीके" के संबंध में, मैं परिणामी पदानुक्रमित संरचना को समूहों की वांछित संख्या में कटौती करने के लिए समुदायों पर 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 समूहों देखते हैं, लेकिन हम मोटे कटौती इसलिए चाहते हैं कि, dendrogram की जांच:

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 
संबंधित मुद्दे