Как найти ближайшие 2 точки в 100-мерном пространстве с 500000 точек?

У меня есть база данных с 500000 точек в 100-мерном пространстве, и я хочу найти ближайшие 2 точки. Как мне это сделать?

Обновление: Пространство евклидово, извините. И спасибо за все ответы. Кстати, это не домашнее задание.

5 ответов

Решение

Вы можете попробовать библиотеку ANN, но это дает надежные результаты только до 20 измерений.

Во введении к алгоритмам есть глава, посвященная поиску двух ближайших точек в двумерном пространстве за O(n*logn) времени. Вы можете проверить это на книгах Google. На самом деле, я предлагаю это всем, так как метод решения проблемы "разделяй и властвуй" очень прост, элегантен и впечатляет.

Хотя это не может быть расширено непосредственно к вашей проблеме (как постоянная 7 будет заменен на 2^101 - 1), это должно быть хорошо для большинства наборов данных. Итак, если у вас есть достаточно случайный ввод, он даст вам O(n*logn*m) сложность где n это количество очков и m это число измерений.

редактировать
Это все, если у вас есть евклидово пространство. Т.е. длина вектора v является sqrt(v0^2 + v1^2 + v2^2 + ...), Если вы можете выбрать метрику, однако, могут быть другие варианты для оптимизации алгоритма.

Используйте дерево кд. Вы смотрите на проблему ближайшего соседа, и есть высоко оптимизированные структуры данных для обработки именно этого класса проблем.

http://en.wikipedia.org/wiki/Kd-tree

PS Забавная проблема!

Запустите PCA для ваших данных, чтобы преобразовать векторы из 100 измерений в 20 измерений. Затем создайте дерево K-ближайших соседей (KD-Tree) и получите 2 ближайших соседей на основе евклидова расстояния.

Вообще если нет. измерений очень велики, то вы должны либо использовать метод грубой силы (параллельный + распределенный / картографический) или кластерный подход.

Используйте структуру данных, известную как KD-TREE. Вам нужно будет выделить много памяти, но вы можете обнаружить одну или две оптимизации на основе ваших данных.

http://en.wikipedia.org/wiki/Kd-tree.

Мой друг работал над диссертацией несколько лет назад, когда столкнулся с подобной проблемой. Его работа была порядка 1М баллов по 10 измерениям. Мы создали библиотеку kd-tree для ее решения. Мы можем выкопать код, если вы хотите связаться с нами в автономном режиме.

Вот его опубликованная статья: http://www.elec.qmul.ac.uk/people/josh/documents/ReissSelbieSandler-WIAMIS2003.pdf

Другие вопросы по тегам