2014-07-01 7 views
6

Sto lavorando con Community Detection nei grafici. Sono stato attraverso i diversi algoritmi di rilevamento della comunità implementati in igraph e tracciare le strutture della comunità. Ora dopo aver ottenuto l'oggetto community per diversi algoritmi, voglio confrontare gli algoritmi basati su diverse misure come densità, cut ratio, coverage. (So ​​che la modularità è già implementata). Posso ottenere un sottografo e quindi calcolare la densità intra-cluster ma per trovare la densità tra i cluster, non so come procedere. Questo è il codice che ho usato per trovare la densità intra-cluster:Come trovare le misure dopo il rilevamento della comunità in igraph (R)?

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 

Allo stesso modo ho potuto procedere per ogni cluster e aggiungere tutte le densità o prendere la media del tutto. La mia domanda è che se il numero di comunità è molto grande, allora come procedere?

E se voglio estrarre il numero di spigoli tra diverse comunità, c'è un buon modo per estrarre il numero di spigoli?

Per favore scusami se questa domanda è già stata posta. Sono novizio di IGRAPH e R.

+1

Benvenuti in SO e grazie per aver incluso un esempio riproducibile con la domanda. – MrFlick

+0

@MrFlick Grazie per la risposta e i desideri. Mi ha davvero aiutato molto, anche se mi ci è voluto un po 'di tempo per capire la funzione. – shubhamagarwal92

risposta

6

Beh, possiamo solo adattare il codice per ciclo nei diversi sottogruppi

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) 
}) 

e fino ad ottenere i bordi tra le comunità, si potrebbe fare

#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) 

Inoltre è possibile tracciare le comunità per assicurarsi che sembra ragionevole

plot.communities(wckarate, karate) 

enter image description here

+0

Ho provato a modificare la funzione per calcolare i bordi intra cluster invece di trovare sottografi ma non funziona, potresti aiutarmi per favore: 'cx <- sapply (unique (membership (multilevel)), function (x) { es <- E (g) [V (g) [membership (multilivello) == x] V (g) [membership (multilivello) == x] lunghezza (i) } ' – shubhamagarwal92