Ich habe eine relativ große Grafik mit Vertices: 524 Edges: 1125, von realen Transaktionen. Die Kanten sind gerichtet und haben ein Gewicht (Aufnahme ist optional). Ich versuche die verschiedenen Gemeinschaften innerhalb des Graphen zu untersuchen und brauche im Wesentlichen eine Methode, die:
- Berechnet alle möglichen Gemeinschaften
- Berechnet die optimale Anzahl von Communities
- Gibt die Mitglieder / # der Mitglieder jeder (optimalen) Community zurück
Bisher habe ich es geschafft, den folgenden Code zusammenzustellen, der eine farbcodierte Grafik für die verschiedenen Communities zeichnet, aber ich habe keine Ahnung, wie ich die Anzahl der Communities kontrollieren soll (dh die Top 5 Communities mit den höchsten Mitgliedschaft) oder listet die Mitglieder einer bestimmten Community auf.
%Vor%Da die Edge-Betweenness-Methode so schlecht ausgeführt wurde, habe ich erneut versucht, die walktrap-Methode zu verwenden:
%Vor%19 Cluster - Viel besser!
Nun sage ich, ich hätte einen "bekannten Cluster" mit einer Liste seiner Mitglieder und wollte jeden der beobachteten Cluster auf die Anwesenheit von Mitgliedern des "bekannten Clusters" überprüfen. Rückgabe des Prozentsatzes der gefundenen Mitglieder. Kann das folgende nicht beenden ??
%Vor% Einige dieser Fragen können Sie herausfinden, indem Sie sich die Dokumentation der Funktionen ansehen, die Sie verwenden. Zum Beispiel beschreibt die Dokumentation von clusters
im Abschnitt "Werte", was von der Funktion zurückgegeben wird, von denen einige Ihre Fragen beantworten. Abgesehen von der Dokumentation können Sie immer die Funktion str
verwenden, um die Zusammensetzung eines bestimmten Objekts zu analysieren.
Damit Sie die Mitglieder oder die Anzahl der Mitglieder in einer bestimmten Community ermitteln können, können Sie sich das Objekt membership
ansehen, das von der Funktion clusters
zurückgegeben wird (die Sie bereits verwenden, um Farbe zuzuweisen). So etwas wie:
würde die IDs der Cluster beschreiben, die verwendet werden. Im Fall Ihrer Beispieldaten sieht es so aus, als ob Sie Cluster mit den IDs von 0 bis 585 für insgesamt 586 Cluster haben. (Beachten Sie, dass Sie diese nicht sehr genau mit dem Farbschema anzeigen können, das Sie gerade verwenden.)
Um die Anzahl der Scheitelpunkte in jedem Cluster zu bestimmen, können Sie sich die csize
-Komponente ansehen, die auch von clusters
zurückgegeben wird. In diesem Fall ist es ein Vektor der Länge 586, der für jeden berechneten Cluster eine Größe speichert. So können Sie
um die Liste der Größen Ihrer Cluster zu erhalten. Seien Sie gewarnt, dass Ihre clusterIDs, wie bereits erwähnt, bei 0 ("null-indiziert") beginnen, während R-Vektoren bei 1 ("ein-indexiert") beginnen. Sie müssen diese Indizes also um eins verschieben. Zum Beispiel gibt clusters(all2)$csize[5]
die Größe des Clusters mit der ID 4 zurück.
Um die Scheitelpunkte in einem Cluster aufzulisten, möchten Sie nur herausfinden, welche IDs in der zuvor erwähnten membership
-Komponente mit dem betreffenden Cluster übereinstimmen. Wenn ich also die Scheitelpunkte in Cluster # 128 finden möchte (es gibt 21 davon, entsprechend clusters(all2)$csize[129]
), könnte ich verwenden:
und um die Scheitelpunkte in diesem Cluster abzurufen, kann ich die V
-Funktion verwenden und die Indizes, die ich gerade berechnet habe, die ein Mitglied dieses Clusters sind, übergeben:
Damit würden Sie die grundlegenden Fragen zu igraph beantworten, die Sie hatten. Die anderen Fragen sind eher graphentheoretisch. Ich kenne keine Möglichkeit, die Anzahl der Cluster zu überwachen, die mit iGraph erstellt werden, aber jemand kann Sie auf ein Paket aufmerksam machen, das das kann. Möglicherweise haben Sie mehr Erfolg beim Posten als separate Frage, entweder hier oder an einem anderen Ort.
Was Ihre ersten Punkte anbelangt, dass Sie durch alle möglichen Gemeinschaften iterieren wollen, werden Sie feststellen, dass dies für ein Diagramm von beträchtlicher Größe undurchführbar ist. Die Anzahl der möglichen Anordnungen des Vektors membership
für 5 verschiedene Cluster wäre 5 ^ n, wobei n die Größe des Graphen ist. Wenn du "alle möglichen Gemeinschaften" finden willst, ist diese Zahl tatsächlich O (n ^ n), wenn meine mentale Mathematik korrekt ist. Im Wesentlichen wäre es unmöglich, dies über ein Netzwerk mit vernünftiger Größe erschöpfend zu berechnen, selbst bei massiven Rechenressourcen. Also denke ich, dass es besser ist, eine Art Intelligenz / Optimierung zu verwenden, um die Anzahl der in Ihrem Graphen dargestellten Communities zu bestimmen, wie es die Funktion clusters
tut.
In Bezug auf die Frage, wie man die Anzahl der Communities in der OP-Frage kontrolliert, verwende ich die cut_at-Funktion in den Communities, um die resultierende hierarchische Struktur in eine gewünschte Anzahl von Gruppen zu schneiden. Ich hoffe, dass jemand bestätigen kann, dass ich etwas Sinnvolles tue. Beachten Sie Folgendes:
%Vor%Nun, beachten Sie, dass es 43 Gruppen gibt, aber wir wollen gröbere Schnitte, also untersuchen Sie das Dendrogramm:
%Vor%Und schneiden Sie darauf basierend. Ich habe willkürlich 6 Schnitte gewählt, aber trotzdem haben Sie jetzt gröbere Cluster
%Vor%Tags und Links r igraph modularity