Wie kann der isolierteste Punkt effizient berechnet werden?


8

Wie können wir bei einer endlichen Menge S von Punkten in Rd einen "am meisten isolierten Punkt" effizient berechnen xS?

Wir definieren einen "am meisten isolierten Punkt" x durch

x=argmaxpSminqS{p}d(p,q)

(Ich habe die Notation x=argmin verwendet, obwohl sie nicht unbedingt eindeutig ist. Hier bezeichnet d die euklidische Entfernung.) Mit anderen Worten, wir suchen nach einem Punkt mit der größten Entfernung zum nächsten Nachbarn.

Ein naiver Algorithmus würde alle paarweisen Entfernungen berechnen, den Nachbarn mit der geringsten Entfernung für jeden Punkt finden und dann das Maximum davon finden. Dies erfordert O(n2) -Operationen, aber können wir es besser machen?


Ich schlage vor, Datenstrukturen für die Suche nach dem nächsten Nachbarn zu betrachten . Ich vermute, dass sie angepasst werden können, um dieses Problem effizienter zu lösen als die naive Methode.
DW

@ DW Danke für die Empfehlung. Ich habe versucht, in kd-Bäume zu schauen, aber ich habe keinen effizienteren Weg gefunden, um dieses Problem zu lösen.
Fehler

Antworten:


1

Verwenden Sie einen beliebigen Algorithmus für alle nächsten Nachbarn . dann können Sie Ihr Problem trivial lösen. Ein solcher Algorithmus findet für jeden Datenpunkt seinen nächsten Nachbarn. Der isolierteste Punkt ist der Punkt, dessen nächster Nachbar am weitesten entfernt ist. Wenn Sie also alle nächsten Nachbarn gelöst haben, können Sie den isoliertesten Punkt durch einen einfachen linearen Scan finden.

Anscheinend können alle nächsten Nachbarn in werden; siehe die Referenzen auf Wikipedia. Wenn Sie etwas implementieren möchten, nehmen Sie eine beliebige Datenstruktur für die nächsten Nachbarn und suchen Sie für jeden Punkt den nächsten Nachbarn.O(nlogn)p


0

Wie in den Kommentaren vorgeschlagen, würde ich mich mit Fragen zum nächsten Nachbarn befassen.

Eine NN-Abfrage pro Punkt sollte in der Größenordnung von damit sie bereits besser ist als die naive Lösung.O(nlog(n))

Sie können dies weiter verbessern, indem Sie der NN-Abfrage einen Parameter hinzufügen, der den Abstand des nächsten isolierten Punkts, den Sie bisher gefunden haben , zum nächsten Nachbarn enthält . Sie können dann jede NN-Abfrage abbrechen, sobald sie einen Punkt findet, der näher als . Dies sollte Ihre Suche erheblich beschleunigen.dmaxdmax

Übrigens schlagen die Leute oft KD-Bäume für die NN-Suche vor. KD-Bäume sind sehr einfach zu implementieren, lassen sich aber meiner Erfahrung nach mit höheren Dimensionen weniger gut skalieren als andere Bäume. Für oder so würde ich empfehlen, einen R-Baum wie R * Tree (R-Star-Tree), X-Tree oder STR-geladenen R-Tree oder einen PH-Tree (der eher einem a ähnelt) zu verwenden bitweiser Quadtree).d>10

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.