So finden Sie Geometric Median heraus
Die Frage ist:
Gegeben N Punkte(in 2D) mit x-und y-Koordinaten, finden Sie einen Punkt P (in N
Punkte gegeben), so dass die Summe der Entfernungen von anderen(N-1) Punkte zu
P ist minimum.
Diesem Punkt ist allgemein bekannt als Geometrische Median. Gibt es irgendeine effizienten Algorithmus, um dieses problem zu lösen, andere als die naive O(N^2)
?
InformationsquelleAutor der Frage SexyBeast | 2012-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gelöst, etwas ähnliches für einen lokalen online-Richter einmal mit simulated annealing. Das war die offizielle Lösung als gut und das Programm hat AC.
Der einzige Unterschied war, dass der Punkt, den ich zu finden war nicht Teil der
N
Punkte gegeben.Dies war mein C++ - code, und
N
könnte so groß wie50000
. Das Programm führt in0.1s
auf einem 2-GHz pentium 4.Dann denke ich, ist Es richtig zu wählen aus Ihrer Liste, die am nächsten an der
(x, y)
zurückgegeben, die von diesem Algorithmus.Dieser Algorithmus nutzt, was diesen wikipedia-Absatz auf den geometrischen median sagt:
Den ersten Absatz oben erklärt, warum das funktioniert: weil die Funktion, die wir versuchen, zu optimieren, hat keine lokalen minima, so können Sie gierig suchen das minimum iterativ zu verbessern.
Betrachten Sie dies als eine Art binäre Suche. Erste, Sie annähernd das Ergebnis. Eine gute Näherung wird das Zentrum der Schwerkraft, die meinen code berechnet, wenn die Eingabe gelesen. Dann, sehen Sie, wenn die angrenzenden Punkte zu geben Ihnen eine bessere Lösung. In diesem Fall wird ein Punkt benachbart, wenn es eine Distanz von
step
Weg vom aktuellen Punkt. Wenn es besser ist, dann ist es gut, verwerfen Sie Ihren aktuellen Punkt, weil, wie ich schon sagte, dies wird nicht Sie in die Falle ein lokales minimum, da von der Natur der Funktion, die Sie versuchen zu minimieren.Nachdem Sie die Hälfte der Schrittweite, wie in binäre Suche, und weiter, bis Sie haben, was Sie betrachten, um eine ausreichend gute Näherung (gesteuert durch die
eps
Konstante).Die Komplexität des Algorithmus hängt also wie genau wollen Sie das Ergebnis zu sein.
InformationsquelleAutor der Antwort IVlad
Es scheint, dass das problem schwierig zu lösen, besser als
O(n^2)
Zeit bei der Verwendung euklidischer Distanzen. Aber der Punkt, dass minimiertdie Summe der Manhattan-Distanzen auf andere Punkte oder den Punkt, dass minimiert die Summe der Quadrate der euklidischen Abstände auf andere Punkte
finden Sie in
O(n log n)
Zeit. (Vorausgesetzt, die Multiplikation von zwei zahlen istO(1)
). Lassen Sie mich schamlos copy/paste meine Lösung für Manhattan Entfernungen aus einer aktuellen post:Können wir verfolgen einen ähnlichen Ansatz für die Berechnung der Punkt, dass minimiert die Summe der Quadrate der euklidischen Abstände zu anderen Punkten. Lassen
die sortierten x-Koordinaten: x1, x2, x3, ... xn. Wir Scannen diese Liste von Links nach rechts und für jeden Punkt xi - wir berechnen:
li = Summe der Entfernungen zu allen Elementen, die Links von xi = (xi-x1) + (xi-x2) + .... + (xi-xi-1) , und
sli = Summe der Quadrate der Abstände aller Elemente, die Links von xi = (xi-x1)^2 + (xi-x2)^2 + .... + (xi-xi-1)^2
Beachten Sie, dass Ihnen li und sli - wir berechnen können li+1 und sli+1 in
O(1)
Zeit wie folgt:Let d = xi+1-xi. Dann:
li+1 = li + id und sli+1 = sli + id^2 + 2*i*d
Damit können wir berechnen Sie alle li und sli in der linearen Zeit durch das Scannen von Links nach rechts. Ebenso für jedes element können wir berechnen, die
ri: Summe der Entfernungen aller Elemente auf der rechten und der sri: Summe der Quadrate der Abstände aller Elemente auf der rechten Seite in lineare
Zeit. Hinzufügen von sri und sli für jedes i gibt die Summe der Quadrate der horizontalen Entfernungen zu allen Elementen, die in linearer Zeit. Ebenso
berechnen der Summe der Quadrate der vertikalen Abstände aller Elemente.
Dann können wir Scannen durch die original-Punkte-array und den Punkt, dass minimiert die Summe der Quadrate der vertikalen und horizontalen Strecken vor.
InformationsquelleAutor der Antwort krjampani
Wie bereits erwähnt, die Art des Algorithmus zu verwenden, hängt von der Art und Weise Sie den Abstand Messen. Seit Ihrer Frage nicht angeben, diese Maßnahme, hier werden C-Implementierungen sowohl für die Manhattan Distanz und die Quadrierte euklidische Distanz. Verwenden
dim = 2
für 2D-Punkte. KomplexitätO(n log n)
.Manhattan Distanz
Kurze Erklärung: Wir können die Summe, die die Strecke pro dimension, 2 in deinem Fall. Sagen wir, wir haben
N
Punkte und die Werte in einer dimension sindv_0
..,v_(N-1)
undT = v_0 + .. + v_(N-1)
. Dann für jeden Wertv_i
wir habenS_i = v_0 .. v_(i-1)
. Jetzt können wir express die Manhattan-Distanz für diesen Wert durch die Summe jener auf der linken Seite:i * v_i - S_i
und auf der rechten Seite:T - S_i - (N - i) * v_i
die Ergebnisse in(2 * i - N) * v_i - 2 * S_i + T
. HinzufügenT
alle Elemente, die nicht die Reihenfolge ändern, also lassen wir das aus. UndS_i
berechnet werden kann on-the-fly.Hier ist der rest von dem code, macht es zu einem wirklichen C-Programm:
Quadrierte euklidische Distanz
Kürzere Erklärung: so Ziemlich den gleichen Ansatz wie die Vorherige, aber mit einem etwas komplizierten Herleitung. Sagen
TT = v_0^2 + .. + v_(N-1)^2
bekommen wirTT + N * v_i^2 - 2 * v_i^2 * T
. Wieder TT ist Hinzugefügt, um alle, so kann es weggelassen werden. Weitere Informationen auf Anfrage.InformationsquelleAutor der Antwort leo
Implementiert habe ich das Weiszfeld-Methode (ich weiß, es ist nicht das, was du suchst, aber es kann helfen, um eine Ungefähre Ihren Punkt), die Komplexität ist O(N*M/k) wobei N die Anzahl der Punkte, M die dimension der Punkte (in deinem Fall ist 2), und k ist der Fehler erwünscht:
https://github.com/j05u3/weiszfeld-implementation
InformationsquelleAutor der Antwort josue.0
Schritt 1: Sortieren Sie die Punkte-Sammlung von x-dimension (nlogn)
Schritt 2: Berechnen Sie den x-Abstand zwischen jedem Punkt und alle Punkte LINKS:
Schritt 3: Berechnen Sie den x-Abstand zwischen jedem Punkt und alle Punkte RECHTS:
Schritt 4: Summe beide bis Sie bekommen den gesamten x-Entfernung von jedem Punkt zu den anderen N-1 Punkte
Den Punkt mit der kleinsten Summe der
xDist
undyDist
ist die AntwortGesamt-Komplexität O(nlogn)
Antwort in C++
Weitere Erklärung:
Die Idee ist die Wiederverwendung der bereits berechnete Gesamt-Distanz von vorhergehenden Punkt.
Angenommen, wir haben 3-Punkt-ABCD sortiert, sehen wir, dass die gesamte linke Abstand D zu den anderen, bevor es sind:
In die
(AC + BC)
ist die Summe linken Abstand von C zu den anderen, bevor er, nutzten wir diese und müssen nur berechnenldist(C) + 3CD
InformationsquelleAutor der Antwort rocketspacer
Können Sie das problem lösen, wie eine konvexe Programmierung (Die Zielfunktion ist nicht immer konvex ist). Die konvex-Programm behoben werden können, mit einem iterativen wie L-BFGS. Die Kosten für jede iteration ist O(N) und in der Regel die Anzahl der benötigten iteration ist nicht groß. Ein wichtiger Punkt zu reduzieren die Anzahl der benötigten Iterationen ist, dass wir wissen, dass die optimale Antwort ist einer der Punkt in der Eingabe. So kann die Optimierung beendet werden, wenn seine Antwort sich in der Nähe einer der Eingabe-Punkte.
InformationsquelleAutor der Antwort iampat