Approccio ed esempio di clustering dei grafici in "R"


10

Sto cercando di raggruppare / unire i nodi in un grafico usando il clustering dei grafici in 'r'.

Ecco una variazione incredibilmente giocattolo del mio problema.

  • Esistono due "cluster"
  • C'è un "ponte" che collega i cluster

Ecco una rete candidata:
inserisci qui la descrizione dell'immagine

Quando guardo la distanza di connessione, il "hopcount", se vuoi, allora posso ottenere la seguente matrice:

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

Pensieri qui:

  • Per fortuna o per la semplicità del giocattolo, la matrice ha chiazze evidenti, questo non sarà il caso nella matrice (molto grande). Se randomizzassi la relazione tra punto e riga, non sarebbe così pulito.
  • Potrei sbagliarmi, quindi se ho un refuso, fammelo sapere.
  • Il conteggio dei salti qui è il numero più breve di salti per collegare il punto sulla riga i con il punto sulla colonna j. Un self-hop è ancora un hop, quindi la diagonale è tutto uno.

Quindi in questa matrice una distanza maggiore (luppolo) ha un numero maggiore. Se volessi una matrice che mostra "connettività" anziché distanza, allora potrei fare un punto-inverso, in cui ogni cella della matrice viene sostituita con il suo inverso moltiplicativo.

Domande:

Per aiutarmi a trovare la mia strada:

  • Quali sono i termini per ridurre il numero di nodi su un grafico combinandoli? Si tratta di raggruppamento, fusione, fusione: quali sono le parole che dovrei usare?
  • Quali sono le tecniche comprovate? C'è un libro di testo sull'argomento? Puoi indicare documenti o siti Web?
  • Ora ho provato a guardare prima qui - è un ottimo posto per il "primo controllo". Non ho trovato quello che cercavo. Se l'ho perso (non è improbabile) puoi indicarmi una o due domande con risposta sull'argomento qui al CV?

Per portarmi dove sto andando:

  • Esiste un pacchetto "R" che raggrupperà correttamente i nodi sulla rete?
  • Potresti indicarmi il codice di esempio per farlo?
  • Esiste un pacchetto 'R' che presenterà graficamente la rete ridotta risultante?
  • Potresti indicarmi il codice di esempio per farlo?

Grazie in anticipo.


2
Si prega di essere consapevoli del fatto che richiedere pacchetti (R) o codice è fuori tema qui. Potresti voler rendere la parte "trova" più prominente e la parte "ottenere" meno.
gung - Ripristina Monica

3
Cercherò di dare una risposta completa qualche volta quando avrò la possibilità @gung. Ma per una risposta rapida ecco il rilevamento della comunità applicato al grafico di esempio di EngrStudent usando il igraphpacchetto R.
Andy W,

1
IMHO c'è un solo cluster in questo grafico. Vi sono, tuttavia, tre cricche sovrapposte . Non so perché il tuo piano sia quello di distruggere la cricca centrale - a meno che tu non possa formalizzare questo, avrai difficoltà a trovare un algoritmo.
Ha QUIT - Anony-Mousse il

2
Per quello che vale, mcl ( micans.org/mcl ) trova i due cluster (non sono davvero d'accordo con la valutazione di Anony-Mousse e non trovo particolarmente fruttuoso l'approccio di modellistica della cricca al grappolo grafico). Questo è con il suo singolo parametro (controllo della granularità) impostato sul valore predefinito. Questo algoritmo (mcl - l'ho pubblicato) è ampiamente utilizzato in bioinformatica ed è disponibile un codice sorgente (altamente scalabile). L'interfaccia con R è facile da usare usando le interfacce di testo.
Micans,

2
Chiedere codice e pacchetti è stato essenzialmente fuori tema qui. Chiedere aiuto con il codice esistente (ovvero avere un esempio riproducibile ) è in argomento su StackTranslate.it . Se non lo sapevi, è tempo di impararlo. L'idea che gli utenti che rispondono a R Q su SO non abbiano competenze statistiche è strana per me, ma molte persone sembrano supporre che; in ogni caso non è vero. Che il tuo Q abbia ricevuto risposta da un post SO dovrebbe dire qualcosa qui. OTOH, dicendo "che tipo di analisi è questa, qualcuno può indicarmi le risorse" è sicuramente in tema qui.
gung - Ripristina Monica

Risposte:


9

Il tuo esempio particolare suggerisce di trovare comunità all'interno della rete che abbiano più connessioni tra nodi nella comunità e relativamente pochi spigoli tra nodi in comunità diverse. Ciò è distinto dalla ricerca di comunità isolate , in cui vi sono sottografi completamente disconnessi.

Ecco un esempio di rilevamento della comunità in R usando il igraphpacchetto e un algoritmo descritto in Clauset et al. (2004) . Per usare questo algoritmo, trasformo il tuo "conteggio dei luppoli" in una matrice binaria di adiacenza senza loop automatici. L'algoritmo necessita di una matrice non orientata, coerente con il diagramma scritto a mano e con i dati forniti (i bordi sono simmetrici).

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

inserisci qui la descrizione dell'immagine

Non posso commentare l'adeguatezza del collasso di tali nodi per ulteriori analisi, ma tale rilevamento della comunità è sicuramente utile per esplorare la rete. Esistono anche molti altri algoritmi di rilevamento della comunità (nonché altre librerie per l'analisi della rete in R). Questo è solo un esempio che sembra produrre l'output desiderato per questo problema giocattolo.


1
Inoltre, dati i commenti precedenti sull'utilizzo di un database grafico, non è necessario che il grafico sia rappresentato come matrice di adiacenza. Una tabella per i nodi e una riga per ciascun bordo è un formato più tipico / efficiente e puoi trasformarlo in una igraphrete.
Andy W,

1

Se non si è già collegati a un repository per i dati del nodo e della connessione, è possibile esaminare il pacchetto Rneo4j. Ma questo implica l'uso del neo4j (un database grafico, non un RDBMS) per archiviare i tuoi dati. Non sono un esperto qui, ma penso che questo approccio potrebbe essere particolarmente efficace se a) come suggerito da Anony-Mousse, non è possibile formalizzare questo, oppure b) il numero di nodi e connessioni è particolarmente grande, oppure c) si avvolge avere ulteriori domande sulla tua rete.


Non sapevo che esistesse una cosa del genere. ! Neat È un esempio decente del materiale? nicolewhite.github.io/RNeo4j/examples
EngrStudent

Come si passerebbe dai dati in neo4j al clustering grafico? Mcl o igraph lavorerebbe con esso?
EngrStudent

2
Dopo aver estratto i tuoi dati da neo4j in R, puoi utilizzare qualsiasi altro pacchetto R (ad es. AndyW suggerisce igraph) contro i dati. In alternativa, il pacchetto Rneo4j include comandi per il recupero dei dati e consente anche di eseguire il linguaggio di query Cypher (analogo a SQL, ma creato su misura per il grafico neo4j db). In Cypher puoi eseguire query sofisticate ed eseguire alcuni algoritmi predefiniti (percorsi più brevi, tutti i percorsi, tutti i percorsi semplici, Dijkstra, ecc.). Sono al mio limite qui sia nei personaggi che nei contenuti - Se vuoi seguire questo percorso (scusami!), Il sito neo4j potrebbe essere la tua prossima fermata.
user3123116

1

Per i futuri lettori,

Ecco un insieme di funzioni dai pacchetti igraph e l'ultimo è di MCL:

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

Puoi trovare la documentazione qui http://igraph.org/r/doc/ e qui https://cran.r-project.org/web/packages/MCL/MCL.pdf

Trovo particolarmente utile il walktrap


Sebbene ciò possa essere correlato alla domanda, non sembra essere una risposta.
Michael R. Chernick,

2
ho risposto alle due domande: esiste un pacchetto "R" che raggrupperà correttamente i nodi sulla rete? Potresti indicarmi il codice di esempio per farlo? Ma sì, non risponde a tutte le domande.
Omar Jaafor,
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.