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., was, wenn hoch ist und | X | ist relativ niedrig gewinnt nie. (Alles ist in Erinnerung.)
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?
Antworten:
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.
quelle
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.
Siehe auch dieses Papier von Callahan und Kosaraju.
quelle