Algoritmo di clustering grafico efficiente


20

Sto cercando un algoritmo efficiente per trovare i cluster su un grafico di grandi dimensioni (ha circa 5000 vertici e 10000 bordi).

Finora sto usando l'algoritmo Girvan-Newman implementato nella libreria java JUNG ma è piuttosto lento quando provo a rimuovere molti bordi.

Potete suggerirmi un'alternativa migliore per i grafici di grandi dimensioni?


Hai guardato k-mean?
Oded,

Potete per favore darmi qualche riferimento per sapere come usarlo su un grafico?
mariosangiorgio,


Sono passato all'implementazione JUNG di VoltageClusterer ed è decisamente veloce. jung.sourceforge.net/doc/api/edu/uci/ics/jung/algorithms/…
mariosangiorgio

1
Questo non è più appropriato per < cs.stackexchange.com > poiché si tratta più dell'informatica che dell'ingegnere del software?
Oeufcoque Penteano,

Risposte:


13

Personalmente suggerisco il raggruppamento di Markov . L'ho usato più volte in passato con buoni risultati.

La propagazione dell'affinità è un'altra opzione praticabile, ma sembra meno coerente del clustering di Markov.

Esistono varie altre opzioni, ma queste due sono già pronte per l'uso e ben si adattano al problema specifico dei grafici di clustering (che è possibile visualizzare come matrici sparse). Anche la misura della distanza che stai usando è una considerazione. La tua vita sarà più semplice se stai usando una metrica corretta.

Ho trovato questo documento mentre cercavo benchmark prestazionali, è un buon sondaggio sull'argomento.


Grazie, darò un'occhiata a tutti gli algoritmi che hai suggerito.
mariosangiorgio,

Correzione: questi algoritmi necessitano come pesi di input che riflettono la somiglianza, non la distanza. La proprietà metrica (disuguaglianza del triangolo) non vi entra. Può essere utile trasformare i pesi in modo che rientrino in un intervallo naturale, ad esempio per le correlazioni (Pearson) come descritto qui ( micans.org/mcl/man/clmprotocols.html#array ) e per i valori E BLAST come descritto qui ( micans.org/mcl/man/clmprotocols.html#blast ).
Micans,

10

Clustering gerarchico

Questo mi è stato consigliato da un amico. Secondo Wikipedia :

In questo metodo si definisce una misura di somiglianza che quantifica un tipo (solitamente topologico) di somiglianza tra coppie di nodi. Le misure comunemente usate includono la somiglianza del coseno, l'indice di Jaccard e la distanza di Hamming tra le file della matrice di adiacenza. Quindi si raggruppano nodi simili in comunità secondo questa misura. Esistono diversi schemi comuni per eseguire il raggruppamento, i due più semplici sono il clustering a collegamento singolo, in cui due gruppi sono considerati comunità separate se e solo se tutte le coppie di nodi in gruppi diversi hanno somiglianza inferiore a una determinata soglia e clustering completo di collegamenti , in cui tutti i nodi all'interno di ciascun gruppo hanno somiglianza maggiore della soglia.

Markov Cluster

Questo è quello che uso nella tua situazione. È un algoritmo molto utile. Ho trovato un link a un bel PDF sull'algoritmo. È un ottimo algoritmo e, per mancanza di un termine migliore, estremamente "potente". Provalo e vedi.


5

Per il tuo problema qui, penso che dovresti pensare a un modo per mappare vertici-bordi a un insieme di coordinate per ciascun vertice. Non sono sicuro che esista un modo migliore per farlo. Tuttavia, penso che potresti iniziare rappresentando ciascun vertice come una dimensione e quindi, il valore del bordo di un particolare vertice diventerebbe il valore con cui devi lavorare per quella particolare dimensione. Dopodiché potresti fare una semplice distanza di Euclide e lavorare con quello.


1
Dopo aver letto un po ', ho trovato questo, qui e penso che dovresti dare un'occhiata.
viki.omega9,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.