Frage

Ich habe eine Anwendung, in dem Benutzer mit jedem-interagieren. Ich mag diese Interaktionen sichtbar zu machen, damit ich feststellen kann, ob Gruppen von Benutzern vorhanden ist (in denen Interaktionen sind häufiger).

Ich habe einen 2D-Punkt für jeden Benutzer zugewiesen (wobei jede Koordinate zwischen 0 und 1). Meine Idee ist, dass zwei Benutzer Punkte bewegen näher zusammen, wenn sie interagieren, eine ‚Anziehungskraft‘, und ich nur immer wieder gehen durch meine Interaktion meldet immer und immer wieder.

Natürlich, ich brauche eine „abstoßende Kraft“, die Benutzer auseinander drücken, andernfalls werden sie alle nur in einem einzigen Punkt zusammenfallen.

Zuerst versuchte ich die niedrigste Überwachung und höchsten jeder der XY-Koordinaten, und ihre Positionen zu normalisieren, aber das hat nicht funktioniert, ein paar Benutzer mit einer kleinen Anzahl von Interaktionen an den Rand waren, und der Rest alles brach in die Mitte.

Wer weiß, was die Gleichungen soll ich die Punkte zu bewegen verwenden, um sowohl für die „attraktiv“ Kraft zwischen den Nutzern, wenn sie interagieren und eine „abstoßende“ Kraft, sie alle in einen einzigen Punkt kollabiert zu stoppen?

Edit: Als Antwort auf eine Frage, ich möchte darauf hinweisen, dass ich mit über 1 Million Benutzer zu tun habe, und etwa 10 Millionen Interaktionen zwischen den Nutzern. Wenn jemand ein Tool empfehlen, dass dies für mich tun konnte, bin ich ganz Ohr: -)

War es hilfreich?

Lösung

In der Vergangenheit, als ich diese Art der Sache ausprobiert habe, habe ich ein Federmodell verwendet, um verknüpften Knoten an einem Strang ziehen, so etwas wie: dx = -k*(x-l). dx ist die Veränderung in der Position, x die aktuelle Position, l ist die gewünschte Trennung und k ist die Federkonstante, die Sie zwicken, bis Sie eine gute Balance zwischen Federkraft und Stabilität zu erhalten, wird es als 0,1 weniger. Mit l > 0 sorgt dafür, dass alles am Ende nicht in der Mitte.

Zusätzlich zu, dass eine allgemeine „abstoßend“ Kraft zwischen allen Knoten verteilt wird sie aus, so etwas wie: dx = k / x^2. Dies wird größer, je näher zwei Knoten sind, k zwicken eine angemessene Wirkung zu erhalten.

Andere Tipps

Ich kann einige Möglichkeiten empfehlen: Erstens, versuchen log-Skalierung der Interaktionen oder sie durch eine Sigmoidfunktion läuft um den Bereich zu quetschen. Dies gibt Ihnen eine glattere visuelle Verteilung des Abstandes.

Unabhängig von dieser Skalierung Frage: Blick auf einige der Rendering-Strategien in graphviz, insbesondere die Programme „neato“ und „fdp“. Aus der Manpage:

  neato  draws  undirected graphs using ``spring'' models (see Kamada and
  Kawai, Information Processing Letters 31:1, April 1989).   Input files
  must  be  formatted  in the dot attributed graph language.  By default,
  the output  of  neato  is  the  input  graph  with  layout coordinates
  appended.

  fdp  draws  undirected  graphs using a ``spring'' model. It relies on a
  force-directed approach in the spirit of Fruchterman and Reingold  (cf.
  Software-Practice & Experience 21(11), 1991, pp. 1129-1164).

Schließlich betrachten wir eine der Skalierung Strategien, um eine Anziehungskraft, und eine Art von Luftwiderstandsbeiwert anstelle einer Abstoßungskraft. Eigentlich Dinge näher bewegen und dann möglicherweise später weiter auf möglicherweise nur Sie zyklisches Verhalten erhalten.

Betrachten wir ein Modell, in dem alles, was wird Zusammenbruch schließlich, aber langsam. Dann einfach laufen lassen, bis eine bestimmte Bedingung erfüllt ist (ein Knoten durchquert das Zentrum der Layoutbereich oder so).

Ziehen oder Impuls kann nur als Grundbewegungswiderstand und die Menge zu drosseln, die Bewegungen codiert werden; es kann unterschiedlich angewendet werden (Dinge langsamer auf Bewegung basiert, wie weit sie gegangen sind, wo sie im Raum sind, wie viele andere Knoten sind in der Nähe, usw.).

Hope, das hilft.

Das Federmodell ist die traditionelle Art und Weise, dies zu tun: eine Anziehungskraft zwischen jedem Knoten auf der Interaktion und eine Abstoßungskraft zwischen allen Knoten auf der Basis des inversen Quadrat der Entfernung basiert. Dann lösen, die Energie zu minimieren. Sie können einige ziemlich hohe powered Programmierung benötigen eine effiziente Lösung für dieses Problem zu erhalten, wenn Sie mehr als ein paar Knoten haben. Stellen Sie sicher, dass die Startpositionen zufällig sind, und führen Sie das Programm mehrmals: ein Fall, wie dies fast immer mehrere lokale Minima in ihm hat, und Sie wollen sicherstellen, dass Sie ein gutes haben.

Auch wenn Sie nur ein paar Knoten haben, würde ich in 3D dies tun. Eine zusätzliche Dimension der Freiheit ermöglicht bessere Lösungen, und Sie sollen auch wenn nicht besser als 2D.

zu visualisieren Cluster in 3D-fähig sein
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top