Mam stosunkowo duży wykres z wierzchołkami: 524 krawędzie: 1125 transakcji rzeczywistych. Krawędzie są skierowane i mają ciężar (włączenie jest opcjonalne). Próbuję zbadać różne społeczności w obrębie wykresu, a przede wszystkim potrzebny jest metodą, która:R: metoda igraph, community detection, edge.betweenness, liczba/lista członków każdej społeczności?
-Calculates wszystkich możliwych społeczności
-Calculates optymalna liczba wspólnot
-Returns Członkowie/liczba członkowie każdej (optymalnej) społeczności
Do tej pory udało mi się zebrać następujący kod, który kreśli kolorowy wykres odpowiadający różnym społecznościom, jednak nie mam pojęcia, jak kontrolować liczbę społeczności (np. wytypuj 5 najlepszych społeczności za pomocą h członkostwo ighest) lub wymieniać członków konkretnej społeczności.
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)
Ponieważ metoda krawędź betweenness wykonywane tak źle Próbowałem ponownie stosując metodę 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 klastrów - o wiele lepszy!
Teraz mówię, że miałem "znaną gromadę" z listą jej członków i chciałem sprawdzić każdy z obserwowanych klastrów pod kątem obecności członków z "znanego klastra". Zwracanie procentu znalezionych członków. Nie można ukończyć następujących czynności?
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)
}
Czy możesz podać kod do utworzenia obiektu 'all'? Lub, jeśli jest zbyt duży, przynajmniej niewielka jego wersja? Mam problem z odtworzeniem tego problemu. –
@JeffAllen, przeprosiny dodały kilka przykładowych danych z Facebooka, faktycznie dane, nad którymi pracuję są ~ 50 razy większe od tego .. Dzięki –
@JeffAllen, Dzięki milionowi to była świetna pomoc. Zauważysz, że zmieniłem powyższą metodę wykrywania społeczności, aby poprawić wydajność. Wszelkie sugestie, w jaki sposób mogę rozwiązać mój problem dopasowania? –