Для применения машинного обучения моя группа должна рассчитать евклидово расстояние до ближайший сосед в наборе для каждого (за от 5 до 100, и от нескольких сотен до нескольких миллионов). В настоящее время мы используем либо грубую силу подход или очевидный с KD-дерева на который когда высокий и относительно низок, никогда не побеждает. (Все в памяти.)
Похоже, что должен быть лучший способ, чем грубая сила - по крайней мере, тот, который использует неравенство треугольника, или, возможно, с помощью хэшей, чувствительных к локальности. Достаточно узкое приближение также потенциально хорошо.
Исследование, которое я смог найти, похоже, сосредоточено на проблеме поиска единственного ближайшего соседа (или того, который приблизительно является ближайшим). Идет ли проблема, которую я ищу, под каким-то другим именем, или есть связь с проблемой, о которой я не думал?
Ответы:
Вот простой трюк, который может быть полезен. Рассмотрим случайную выборку, которая выбирает каждую точку с вероятностью 1 / k. Легко проверить, что с большой вероятностью именно один из ваших k ближайших соседей будет в выборке. Вычислить ближайшего соседа в образце. Повторите это O (k log n) раз. С большой вероятностью k ближайших точек вO(klogn) Вычисленные точки - это k ближайших соседей к вашему запросу. Таким образом, нахождение k ближайшего соседа эквивалентноO(klogn) запросы ближайшего соседа.
Короче говоря, дайте мне быструю структуру данных для ответа на запросы ближайшего соседа, и я был бы рад предоставить вам быструю структуру данных k-ближайшего соседа.
источник
Дешевое приблизительное решение, использующее «хеш-код с учетом локальности», состоит в преобразовании каждой точки в форму с чередованием битов:
[xxx, yyy, zzz] -> xyzxyzxyz
затем радикальная сортировка для предварительной обработки.
Выберите свою точку для запроса и впередk указывает в обоих направлениях, чтобы получить размер 2k набор; затем возьмитеkth ближайший к вашей точке. Также посмотрите эту статью Коннора и Кумара.
Также посмотрите эту статью Каллахана и Косараджу.
источник