Communities Una comunità è un sottografo in cui i nodi membri sono molto connessi tra loro e la densità degli edge esistenti all’interno del gruppo è molto maggiore rispetto a quella degli edge che connettono nodi interni al gruppo con nodi esterni. In una rete in cui sia presente una struttura in comunità, esistono solitamente gruppi di nodi molto connessi e altri ancora che agiscono come ponti tra le diverse comunità. Di conseguenza, evidenziare una rilevante struttura in comunità all’interno di una rete rappresenta un potente strumento per comprenderne la forma, il funzionamento e il suo eventuale meccanismo di crescita. La rete in figura presenta due comunità (nodi rossi e nodi blu) Algoritmi Le reti sociali, come altre reti reali presentano una strutturazione naturale in comunità. Si vuole determinare tale struttura naturale, e non imporre una partizione artificiale fissando il numero o la dimensione delle comunità. Trovare le comunità all'interno di una rete arbitraria è un compito difficile per varie motivazioni. Il numero di comunità all'interno della rete è in genere sconosciuto e le comunità sono spesso di dimensioni e/o densità differenti. Inoltre il problema presenta difficoltà computazionali, poiché gli algoritmi devono trovare una buona suddivisione di reti molto grandi in un tempo accettabile. 1 Algoritmo di Newman e Girvan. Una tipologia di algoritmi si basa su metodi di partizione del grafo (graph partitioning). Tra questi l’algoritmo proposto da Newman e Girvan individua gli archi da rimuovere basandosi su un valore di centralità dell’arco, chiamato shortest path betweeness. L’idea si fonda sul ipotesi che gli archi con più grande centralità sono responsabili della connessione di molte coppie di nodi, e quindi sono quelli da eliminare se si vuole separare la rete in comunità. Inoltre due comunità sono unite da pochi archi intercomunità e quindi molti cammini minimi tra coppie di nodi sono quindi costretti a passare proprio per questi tipo di archi, al contrario all’interno di una comunità gli archi sono più densi ed esistono molti cammini alternativi. Idea per il partizionamento: Iniziamo col definire il concetto di "traffico" sulla rete e cercare gli archi che portano la maggior parte di questo traffico. Per ogni coppia di nodi A e B che sono collegati da un cammino, immaginiamo vi sia un’unità di ‘’flusso" lungo gli archi da A a B. Se A e B appartengono a diverse componenti connesse, nessun liquido scorre tra di loro. Altrimenti il flusso tra A e B si divide in modo uniforme lungo tutto il possibili percorsi più brevi da A a B: Quindi se ci sono k cammini minimi da A e B, 1 / k di unità passa lungo ciascuno. Definizione. La betweenness di un edge è la quantità totale di flusso che esso porta, contando il flusso tra cammini minimi di tutte le coppie di nodi che utilizzano questo edge. La betweenness di (1, 2) è 4 (=6/2 + 1), infatti tutti I cammini minimi da 2 a 4, 5, 6, 7, 8, passano per (1, 2) o (2, 3), e (1,2) è il cammino minimo tra 1 e2 L’algoritmo procede iterativamnte eliminando l’edge di massima betweeness. 2 Algoritmo 1. Trovare l’arco di massima betweenness (o gli archi se c’è un pareggio) e rimuovere questi archi dal grafo. / * Questa operazione può disconnettere il grafo. Se è così, questo è il primo livello di regioni del partizionamento del grafo. * / 2. Iterare: Procedere in questo modo finché rimangono archi nel grafo, in ogni fase ricalcolando tutte le betweenness e rimuovendo l’arco o gli archi di betweness massima Esempio. Applichiamo i primi passi dell’algoritmo al grafo in figura. Valori iniziali di betweenness Risulta quindi che vi sono due edge con lo stesso valore massimo. • Rimuoviamo (4,5) e (4, 6), • Ricalcolando I valori, risulta che l’edge (7,9) ha il valore max 4, e deve essere levato. A questo punto il grafo risulta partizionato in tre componenti: 3 Esempio. • Betweenness(1-3) = 1X12=12 • Betweenness(7-8)= 7x7 = 49 • Betweenness(3-7)=betweenness(67) =betweenness(8-9) =betweenness(812)= 3X11=33 Applicando l’algoritmo, si hanno le suddivisioni successive • Betweenness(1-3) = 1X5=5 • Betweenness(3-7)=betweenness(67) =betweenness(8-9) = betweenness(8-12)= 3X4=12 • Betweenness di ogni edge = 1 4 Esempio. Applicando l’algoritmo, si hanno le suddivisioni successive: 5 Calcolo della Betweeness L’algoritmo di Girman-Newman ad ogni passo deve ricalcolare la betweenness di tutti gli edge rimanenti nel grafo. I valori dipendono dal numero di cammini minimi tra ogni coppia di nodi. Vediamo come si possono calcolare efficientemente. L’idea è utilizzare una BFS da ogni nodo u per calcolare come un’unità di flusso si distribuisce nella rete a partire da un nodo u stesso. Algoritmo per il Calcolo della Betweenness 1. A partire da ogni nodo u eseguie una BFS e costruisce l’albero dei percorsi minimi 2. Per ogni nodo v, calcola quanti cammini minimi ci sono da u a v – Se il nodo v si trova al k-imo livello dell’albero i cammini minimi da u a v hanno lunghezza k e passano per i padri di v nell’albero – Il numero dei cammini minimi per v è la somma del numero di cammini minimi per i suoi padri 3. Determina quanto flusso attraversa ogni arco del grafo – Bottom up – Ad ogni nodo assegna un’unità di flusso più tutto quello che gli arriva dai figli – Ogni nodo distribuisce equalmente il proprio flusso tra i padri 6 Una volta effettuata la BFS: • il calcolo del numero di percorsi minimi da A ad altri nodi può essere fatto sommando i valori per percorsi più brevi, muovendosi verso il basso attraverso la struttura di ricerca in ampiezza. • Il flusso può essere determinato partendo dagli strati più bassi della BFS, dividendo il flusso che arriva dall’alto ad ogni nodo in proporzione al numero di cammini minimi che entrano nel nodo su ogni arco. Esempio BFS dal nodo A; • • I valori associati ai nodi corrispondono al numero di cammini minimi da A I valori sugli edge corrispondono al flusso sull’edge stesso. 7 Complessità L’algoritmo richiede di ricalcolare ad ogni passo la betweenness di tutti gli m edge. Quindi si hanno O(m) passi. Per ognuno degli N nodi ad ogni passo occorre un tempo O(m) per computare la BFS e su di essa la betweeness. In totale O(m2N). Quale partizione scegliere? Si è visto che su alcune reti di test, come per esempio la rete di Karate, l’algorimo permette di ottenere una partizione in comunità (quasi ottimale). Ad ed esempio per la rete di Karate, la prima suddivisione che si ottiene (quindi in due parti) rispecchia quasi totalmente la reale suddivisione della rete. Poiché l’algoritmo lavora per partizionamenti successivi, in generale è necessario un criterio per stabilire quale livello di partizione è quello giusto. Una possibilità è quella di valutare i vari livelli di partizionamento utilizzando una misura di bontà delle partizioni. Es. Applicando l’algoritmi di Girvan-Newman, si ottengono le seguenti partizioni successive. La modularità M (che vedremo in seguito) ci dice che la partizione migliore è al livello 3 (l’ultima riportata in figura). 8 Modularity La modularità di una partizione è una quantità scalare che misura la densità di archi all’interno delle comunità individuate in paragone al valore atteso di tale densità. L’idea alla base è quella di quantificare la misura in cui una determinata partizione in comunità presenta una tendenza sistematica ad avere più collegamenti intracomunitari rispetto a quelli che avrebbe la stessa suddivisione in comunità se gli edge fossero ottenuti utilizzando un modello casuale. Valori positivi della modularità indicano che una frazione statisticamente valida di edge in una rete cade all’interno delle comunità individuate dalla partizione. Si calcola come π M= ππ ππ π΄ππ− ππ ππ 2π πΏ(ππ , ππ ) dove Aij è l’ elemento della matrice di adiacenza della rete, ki è il grado del nodo i e m è il numero totale di edge nella rete. Inoltre, ππ è l’etichetta della comunità cui il nodo i è assegnato. Il simbolo πΏ(ππ , ππ ) è pari a 1 se la coppia di nodi appartiene alla stessa comunità e 0 altrimenti --- per questo rientrano nella somma solo gli archi intra-comunità. La frazione attesa di edge è valutata su un grafo casuale in cui la sequenza dei grado dei nodi è invariata rispetto alla rete reale, ma per il quale la probabilità che esista un edge è proporzionale a ππ ππ 2π . Variazione della modularità al variare della partizione, in un grafo che ammette una chiara partizione in due comunità. 9 La modularità M è compresa tra -1 e 1. L’esperienza mostra che valori positivi maggiori di 0.5 indicano la presenza effettiva di una struttura in comunità, mentre valori prossimi allo zero indicano che la distribuzione degli archi tra intra-intercomunità e inter-comunità non si discosta dalla casualità; in grafi casuali il valore atteso di Q è 0. Ipotesi. Un’ipotesi di lavoro, comunemente accettata è la seguente: La partizione ottimale in comunità è quella che massimizza la modularità. In accordo all’ipotesi summenzionata, la modularità può essere utilizzata per confrontare diverse partizioni di una stessa rete. Ottimizzazione della modularità? La partizione corrispondente al valore massimo di modularità per un dato grafo è quindi la migliore partizione possibile per individuare le comunità. Purtroppo però si dimostra che il problema da risolvere è NP-completo. Sono state quindi sviluppate varie euristiche, ma anche queste spesso non riescono a far fronte in tempi ragionevoli alla dimensione attuale delle reti reali. 10