Wie können wir bei einer endlichen Menge von Punkten in einen "am meisten isolierten Punkt" effizient berechnen ?
Wir definieren einen "am meisten isolierten Punkt" durch
(Ich habe die Notation verwendet, obwohl sie nicht unbedingt eindeutig ist. Hier bezeichnet 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 -Operationen, aber können wir es besser machen?
Antworten:
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
quelle
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(n∗log(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.dmax dmax
Ü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
quelle