Найти ближайшие N точек к заданной точке в N-мерном пространстве

Я получил N-мерное пространство с миллионами точек. Я ищу наиболее эффективный способ построить модель, которая позволила бы найти K (K‹100) точек, ближайших к заданной точке во время выполнения.

Список FindClosestMatch (точечная цель, модель модели)

Я начинаю смотреть на R*-деревья, но думаю, правильный ли это подход...


person user2998070    schedule 25.12.2015    source источник
comment
Почему бы и нет? Я бы сказал, ты попробуй.   -  person Cong Ma    schedule 25.12.2015
comment
миллионы не кажутся слишком страшными. Как насчет того, чтобы предварительно вычислить все? Тогда у вас есть постоянный поиск по времени, и 100 * 10 ^ 6 по-прежнему кажется управляемым (особенно при сохранении на жестком диске).   -  person lejlot    schedule 25.12.2015
comment
Да, это поддерживают R-деревья, k-d-деревья или любой другой пространственный/метрический индекс. Это их вариант использования, быстрый поиск близлежащих объектов.   -  person Has QUIT--Anony-Mousse    schedule 25.12.2015


Ответы (3)


Варианты R-Tree — довольно хороший выбор, но M-деревья немного лучше подходят для вашего приложения, поскольку вам нужно вычислить только одно расстояние, чтобы определить, насколько близко ограничивающая сфера находится к вашей целевой точке:

https://en.wikipedia.org/wiki/M-tree

person Matt Timmermans    schedule 25.12.2015
comment
На самом деле M-деревья не очень хорошо работают из-за их гораздо более дорогой конструкции. - person Has QUIT--Anony-Mousse; 25.12.2015
comment
Спасибо, Мэтт. Время строительства не является проблемой, но я хочу оптимизировать время поиска. Я посмотрю на M-деревья - person user2998070; 25.12.2015

Вы можете разделить свое пространство на n-кубов так, чтобы ожидаемое количество точек в кубе было равно rk для некоторого значения r > 1, которое необходимо определить. Тогда для заданного запроса p:

1. Consider the 3^n n-cubes at most 1 away from the cube p is in.
2. Calculate the shortest distance d between p and one of these cubes.
3. Find the distance between p and each point in these cubes.
4. If the total number of points within d is >= k, return the k closest.
5. If not, expand your radius by one cube and repeat.

Когда вы выбираете r, вы жертвуете наличием большего набора точек по умолчанию для поиска, вместо того, чтобы увеличивать радиус в 1 или более раз.

person Dave    schedule 25.12.2015
comment
В N-мерном пространстве это 3 ^ N кубов, а не 9. Рассмотрим 10-мерное пространство, тогда у вас есть более 50000 соседних кубов. - person Has QUIT--Anony-Mousse; 25.12.2015
comment
Спасибо, Дэйв и Anony-Mousse. Количество измерений достаточно велико... N=~500, 3^500 не сработает... - person user2998070; 25.12.2015

Вы также можете просмотреть деревья обложек, которые специально предназначены для поиска kNN. Я также обнаружил, что PH-дерево (мое собственное) работает почти так же хорошо, как и дерево покрытия для 15 или 25 измерений. , при этом значительно экономя место в памяти, особенно для больших наборов данных, и обеспечивая быструю вставку/обновление.

Сравнительная Java-реализация многих алгоритмов доступна в ELKI Framework.

person TilmannZ    schedule 26.12.2015