Berechnung der Entfernung zum k-ten nächsten Nachbarn für alle Punkte in der Menge

9

Für eine Anwendung zum maschinellen Lernen muss meine Gruppe den euklidischen Abstand zum ten nächsten Nachbarn in einer Menge X für jedes x ( X Y ) R d (für d zwischen 5 und etwa 100 und | X |) berechnen | Y | einige hundert bis einige Millionen). Wir verwenden derzeit entweder den Brute-Force- O- Ansatz ( d | X | | X Y | ) oder den offensichtlichen mit einem kd-Baum auf X.kXx(XY)Rdd|X||Y|O(d|X||XY|)X, was, wenn hoch ist und | X | ist relativ niedrig gewinnt nie. (Alles ist in Erinnerung.)d|X|

Es scheint jedoch, dass es einen besseren Weg als Brute-Force geben muss - zumindest einen, der die Dreiecksungleichheit ausnutzt, oder vielleicht mit lokalitätssensitiven Hashes. Eine einigermaßen enge Annäherung ist möglicherweise auch in Ordnung.

Die Forschung, die ich finden konnte, scheint sich auf das Problem zu konzentrieren, den nächsten Nachbarn (oder einen, der ungefähr am nächsten ist) zu finden. Hat das gesuchte Problem einen anderen Namen oder besteht eine Verbindung zu einem verwandten Problem, an das ich nicht gedacht habe?

Dougal
quelle
2
kd-Bäume nutzen die Dreiecksungleichung aus. Haben Sie versucht, andere räumliche Datenpartitionierungsbäume zu verwenden? Eine andere Sache, die Sie untersuchen könnten (ich weiß nichts über Ihren Algorithmus für maschinelles Lernen), ob die spezifischen Punkte tendenziell strukturiert sind, was Ihnen helfen könnte, Hyperebenen schnell zu finden und diese in einem kd-ähnlichen Baum anstelle des üblichen Medianwerts zu verwenden Koordinatenteilung, die in hohen Dimensionen schlecht funktioniert.
Ross Snider
@ RossSnider danke für die Vorschläge. Natürlich verwenden KD-Bäume die Dreiecksungleichung, aber ich dachte an etwas, das schneller als rohe Gewalt wäre. :) Welche anderen Arten von Geodaten-Partitionierungsbäumen würden Sie empfehlen? Von der Wikipedia-Liste scheinen nur vp-Bäume anwendbar zu sein, und sie scheinen nicht besser zu sein als kd-Bäume für die euklidische Entfernung. Und ich werde darüber nachdenken, ob es einen besseren problemspezifischen Weg gibt, trennende Hyperebenen zu definieren, aber einer fällt mir nicht ein.
Dougal
X
k
1
k

Antworten:

10

O(klogn)O(klogn)

Kurz gesagt, geben Sie mir eine schnelle Datenstruktur für die Beantwortung von Fragen zum nächsten Nachbarn, und ich würde Ihnen gerne eine schnelle Datenstruktur zum k-nächsten Nachbarn geben.

Sariel Har-Peled
quelle
kO(klogn)
1
Die Wiederverwendung der Stichproben ist schwierig, da Sie dann verlangen, dass eine feste Stichprobe für JEDE Abfrage funktioniert (die Quantifizierung wird umgedreht), sodass sich die Wahrscheinlichkeiten ändern würden. Die allgemeine Idee wäre dann, eine Reihe von Stichproben größerer Größe zu erstellen (dies hängt von den # Abfragen ab) und sie zu verwenden, wenn dies ein Problem darstellt.
Suresh Venkat
@ SureshVenkat Ah, natürlich. Ich werde mich hinsetzen und die tatsächlichen Wahrscheinlichkeiten herausfinden. Vielen Dank an alle!
Dougal
O(klog(1/δ))1δO(klogn)O(n/k)k
3

Eine billige ungefähre Lösung unter Verwendung eines "lokalitätssensitiven Hash" wäre, jeden Punkt in seine bitverschachtelte Form umzuwandeln:

[xxx, yyy, zzz] -> xyzxyzxyz

dann Radix-Sortierung für die Vorverarbeitung.

k2kkth

Siehe auch dieses Papier von Callahan und Kosaraju.

Chad Brewbaker
quelle