Ich habe einen Satz von 2D-Daten, in denen ich die Zentren einer bestimmten Anzahl von Kreismittelpunkten ( ) finden möchte , die die Gesamtzahl der Punkte innerhalb eines bestimmten Abstands ( ) maximieren .
Ich habe zB 10.000 Datenpunkte und möchte die Zentren von Kreisen finden, die so viele Punkte wie möglich in einem Radius von erfassen . Die 5 Zentren und der Radius von 10 werden vorher angegeben und nicht aus den Daten abgeleitet.
Das Vorhandensein eines Datenpunkts innerhalb eines Kreises ist ein binärer Entweder-Oder-Satz. Wenn , gibt es keinen Wertunterschied zu einem Punkt, der 11 Einheiten entfernt ist, gegenüber 100 Einheiten, da beide> 10 sind. Ebenso gibt es keinen zusätzlichen Wert, wenn Sie sich innerhalb des Kreises befinden, nahe der Mitte oder nahe der Kante . Ein Datenpunkt befindet sich entweder in einem der Kreise oder außerhalb.
Gibt es einen guten Algorithmus, mit dem dieses Problem gelöst werden kann? Diese scheinen mit Clustering-Techniken in Zusammenhang zu stehen, aber anstatt die durchschnittliche Entfernung zu minimieren, ist die "Entfernungs" -Funktion 0, wenn der Punkt innerhalb von eines der Punkte liegt, und ansonsten 1.
Ich würde es vorziehen, einen Weg zu finden, dies in R zu tun, aber jeder Ansatz wäre willkommen.
quelle
Antworten:
Dies ist ein Variations-K-Mittel-Problem. Der Radius der Zentren spielt keine Rolle, solange sie als gleich angenommen werden.
Links:
Die Zentren der Kreise werden an Stellen mit der höchsten Wahrscheinlichkeit der Punkte platziert.
Klassisches K-Mittel-Verfahren:
Optionen:
Warum K-means das Problem angreift:
Es sollte ein Analogon zu einem "Zero Inflated Poisson" geben, bei dem es eine nicht-gaußsche Komponente gibt, die die gleichmäßige Verteilung aufnimmt.
Wenn Sie Ihr Modell "abstimmen" wollten und sicher waren, dass genügend Abtastpunkte vorhanden sind, können Sie mit den k-Mitteln initialisieren und dann einen erweiterten k-Mittel-Einsteller erstellen, der Punkte außerhalb der Radien der Kreise aus dem Wettbewerb entfernt. Es würde die Kreise, die Sie haben, leicht stören, aber es könnte die Leistung angesichts der Daten leicht verbessern.
quelle
Jemand hat wahrscheinlich einen besseren formalen Algorithmus, aber hier ist ein Brute-Force-Ansatz (ein Hack?). Ich würde einen der hexagonalen Binning-Algorithmen verwenden, um ein 2D-Histogramm zu berechnen. Wie
hexbin
inR
.Ich würde eine Sechseckgröße verwenden, die Ihren Kreis mit dem Radius R grob umschreibt und dann nach den oberen N Behältern sortiert. Wenn Sie
N
verschiedene weit entfernte Mülleimer haben, großartig. Eine Möglichkeit besteht nun darin, sich lokal auf einer 2 * R-Skala (in x- und y-Richtung) vom Zentrum der Sechsecke mit der höchsten Dichte um den Kreis zu bewegen. Durch die Berechnung der Dichte kann die Position lokal grob optimiert werden. Dies erklärt die Tatsache, dass die Sechsecke in Bezug auf einen festen Ursprung kein bewegliches Fenster waren.Wenn alle oberen Behälter in der Nähe sind, müssten Sie Ihre Kreise in dieser Umgebung intelligenter bewegen.
Beachten Sie, dass ich mir mehrere Eckfälle vorstellen kann, in denen eine solch naive Strategie spektakulär scheitern wird. Doch nur ein Ausgangspunkt.
In der Zwischenzeit hoffe ich, dass jemand einen besseren Algorithmus hat.
quelle
+R
und-R
dann setzt alle durchführbaren Lösungen auf einen Stapel und wählt unter ihnen. zB in Ihrem1D
Beispiel beim Auftreffen28,29,30,31,32
es das Fenster bis gleiten würde18-28
und38-48
suchen für alle machbar Lösungen. Dann kann man innerhalb dieser nach Kombinationen mit maximaler Punktausbeute suchen. Nicht sicher, ob das helfen würde? Ich versuche zu sehen, ob mein naiver Algorithmus gerettet werden kann. :)