Pokyny:
Odovzdávanie:
Zadanie:
Videli sme, že existujú rôzne algoritmy na hľadanie komunít v sociálnych sieťach, niektoré sú deterministické, iné sú náhodné. Medzi tie náhodné patrí aj label propagtion algoritmus, o ktorom sme tiež hovorili.
Z náhodnosti vyplýva, že ak ho spustíme niekoľkokrát pre tú istú sieť, nemusíme dostať vždy ten istý výsledok. Vyskúšame si to na známej sieti karate klubu.
library(igraph)
library(igraphdata)
data(karate)
set.seed(1)
lay <- layout_nicely(karate)
set.seed(12)
com <- cluster_label_prop(karate)
plot(com, karate, layout = lay)
Niekoľkokrát zopakujeme:
com <- cluster_label_prop(karate)
plot(com, karate, layout = lay)
com <- cluster_label_prop(karate)
plot(com, karate, layout = lay)
com <- cluster_label_prop(karate)
plot(com, karate, layout = lay)
Vidíme, že jedno rozdelenie do komunít sa nám zopakovalo dvakrát, ďalšie dve sa vyskytli len raz a v jednom prípade sme mali aj iný počet komunít ako v ostatných.
Zadanie 1 (2 body). Spravte štatistiku toho, koľko komunít vznikne, keď algoritmus zbehneme viackrát (napríklad 1000 alebo iný dostatočne veľký počet)
Teraz nás bude zaujímať, ktoré vrcholy sa dostali do spoločného zhluku, pomocou čoho potom budeme schopní analyzovať, koľkokrát sa v simuláciách dané vrcholy nachádzali v tej istej komunite.
Vytvoríme maticu A
, ktorej prvok A[i,j]
bude označovať, či sa vrcholy i
a j
nachádzajú v tej istej komunite. To dosiahneme porovnaním com$membership[i] == com$membership[j]
(vo vektore com
je aktuálne posledný výsledok zhlukovania), efektívne je tu použiť funkciu outer
namiesto dvojitého for cyklu.
A <- outer(com$membership, com$membership, FUN = "==") # TRUE/FALSE
A <- outer(com$membership, com$membership, FUN = "==") + 0 # 1/0
rownames(A) <- V(karate)$name
colnames(A) <- V(karate)$name
Kvôli veľkosti matice si zobrazíme len jej časť:
A[1:9, 1:9]
## Mr Hi Actor 2 Actor 3 Actor 4 Actor 5 Actor 6 Actor 7 Actor 8 Actor 9
## Mr Hi 1 1 1 1 0 0 0 1 0
## Actor 2 1 1 1 1 0 0 0 1 0
## Actor 3 1 1 1 1 0 0 0 1 0
## Actor 4 1 1 1 1 0 0 0 1 0
## Actor 5 0 0 0 0 1 1 1 0 0
## Actor 6 0 0 0 0 1 1 1 0 0
## Actor 7 0 0 0 0 1 1 1 0 0
## Actor 8 1 1 1 1 0 0 0 1 0
## Actor 9 0 0 0 0 0 0 0 0 1
Zadanie 2 (3 body). Spočítajte, koľkokrát sa v týchto štyroch zbehnutiach algoritmu (resp. v štyroch vašich zbehnutiach, môžete si nastaviť iný seed) jednotlivé vrcholy dostali do rovnakej komunity.
Pre horeuvedené zhlukovania vrcholov:
A4[1:9, 1:9]
## Mr Hi Actor 2 Actor 3 Actor 4 Actor 5 Actor 6 Actor 7 Actor 8 Actor 9
## Mr Hi 4 4 4 4 1 0 0 4 0
## Actor 2 4 4 4 4 1 0 0 4 0
## Actor 3 4 4 4 4 1 0 0 4 0
## Actor 4 4 4 4 4 1 0 0 4 0
## Actor 5 1 1 1 1 4 2 2 1 0
## Actor 6 0 0 0 0 2 4 4 0 0
## Actor 7 0 0 0 0 2 4 4 0 0
## Actor 8 4 4 4 4 1 0 0 4 0
## Actor 9 0 0 0 0 0 0 0 0 4
Ak zopakujeme dostatočne veľa krát, z výsledkov sa dá robiť štastistika. Ukážka matice počtu zhôd pre 1000 zbehnutí:
A1000[1:9, 1:9]
## Mr Hi Actor 2 Actor 3 Actor 4 Actor 5 Actor 6 Actor 7 Actor 8 Actor 9
## Mr Hi 1000 994 994 994 379 51 51 994 45
## Actor 2 994 1000 1000 1000 373 45 45 1000 45
## Actor 3 994 1000 1000 1000 373 45 45 1000 45
## Actor 4 994 1000 1000 1000 373 45 45 1000 45
## Actor 5 379 373 373 373 1000 622 622 373 13
## Actor 6 51 45 45 45 622 1000 1000 45 1
## Actor 7 51 45 45 45 622 1000 1000 45 1
## Actor 8 994 1000 1000 1000 373 45 45 1000 45
## Actor 9 45 45 45 45 13 1 1 45 1000
Zadanie 3 (5 bodov). Spravte takúto simuláciu a nájdite spôsob, ako z danej matice vyťažiť nejakú informáciu o komunitách v sieti a o správaní sa tohto algoritmu. Interpretujte získané výsledky.