2012-04-10 6 views
1

Während die meisten Fragen zum Gruppieren von Knoten auf der Grundlage von Ähnlichkeit (Taubenlöcher) sind, möchte ich Knoten basierend auf ihrer Nähe gruppieren.Knoten effizient gruppieren?

Ich habe eine große, dichte Sammlung von Knoten - Potenziell Millionen. Auf dem Bildschirm nehmen sie etwas Platz in Anspruch, so dass sie als Größe betrachtet werden können.

Was ich versuche zu tun ist, diese Knoten in einzelne Knoten effizient zu gruppieren, sowohl in der Verarbeitungszeit als auch in der Sammlung von mehr Knoten pro Container.

Meine aktuellen Versuche waren entweder zu langsam oder funktionierten nicht, sondern basieren alle auf der gleichen Lösung, die mir vorschwebt: Berechnen Sie eine Menge möglicher Container, indem Sie einen Knoten und seine umgebenden Knoten nach dem Zufallsprinzip und Gruppieren Sie sie und wählen Sie dann den effektivsten Container aus.

Was sind Ihre Ideen, nicht speziell in irgendeiner Sprache, aber ich werde dafür PHP oder JavaScript verwenden.

Edit 

Ich vergaß zu erwähnen, dass die Knoten strömte werden, so braucht es unbegrenzte Knoten zu übernehmen, sie in Behälter setzen, wie sie kommen, die Schaffung neuer Container oder auch bei Bedarf zu löschen, für bis zu Millionen von Behälter. Das wäre am idealsten.

Antwort

1

Dieses Problem wird Clustering genannt. Sie haben eine Reihe von Knoten und eine Funktion m, die den Abstand zwischen zwei beliebigen Knoten berechnet. Sie suchen nun nach Clustern, so dass die Summe aller Abstände zwischen allen Knoten innerhalb jedes Clusters minimal ist.

Es gibt einige einfache Algorithmen, um dies zu tun. Suchen Sie beispielsweise nach k-Means und k-Medoid. Diese beiden sind Ihrem Ansatz sehr ähnlich. Eine effizientere Version ist der CLARANS Algorithmus [NH94]. Ich habe keine gute Quelle für Sie gefunden, aber hier gehts:

(Deutsch) Skript zum Clustering im Allgemeinen. Enthält CLARANS in Pseudo-Code auf Seite 45 http://www.informatik.hu-berlin.de/forschung/gebiete/wbi/teaching/archive/ws1112/vl_datawarehousing/15_clustering_12.pdf

Englisch-Skript, die CLARANS http://bib.dbvis.de/uploadedFiles/232.pdf

Papier über CLARANS http://www.comp.nus.edu.sg/~atung/publication/pakdd002.pdf

Die "k" in dem Namen ist die Anzahl der Cluster erklärt. Für diese 3 Algorithmen müssen Sie die Anzahl der Cluster a priori angeben. Für einen anderen Ansatz siehe DBSCAN Algorithmus. Sie werden nicht die Anzahl der Cluster für diesen Algorithmus benötigen, aber Sie müssen etwas anderes Wissen über Ihre Knoten bereitstellen. Der wikipedia-Artikel erklärt das sehr gut. :-)

+1

Ich habe den Begriff Clustering in meinem eigenen Code verwendet und es ist genau das, was ich will. Danke für die Algorithmen. Ich schaue mir sie an und lasse Sie wissen, ob es sich um geeignete Lösungen handelt. – DanRedux

+0

Mit Blick auf diese Algorithmen entwarf ich eine, die für mich funktionieren würde, es ist eine Mischung aus ihnen. Ich werde meine "k" -Behälter nach dem Zufallsprinzip platzieren, den nächsten Container zu jedem Knoten finden, diese Gruppen bedeuten, und den Container dorthin bewegen, ein paar Mal wiederholen. Der Teil, den ich verbessern muss, ist die Schleife. Einige Knoten sind außerhalb des Bereichs, und ich frage mich, ob es einen schnelleren Weg gibt, nur durch die Knoten zu laufen, die in der Reichweite anderer Knoten liegen würden. aber es kann sehr spärliche Bereiche mit Knoten außerhalb der Reichweite geben. – DanRedux

+0

Haben Sie den Artikel über DBSCAN schon gelesen? Das scheint das zu sein, was du willst. – Basti