База данных или что-то подобное для хранения данных большого размера и быстрого запроса ближайших соседей / элементов - PullRequest
1 голос
/ 13 апреля 2020

Мы создаем генеративную модель, которая генерирует особенности предмета. Вектор объектов - это вектор высокой размерности (около 200-500 измерений).

Теперь у нас более 10 миллионов элементов в нашем наборе данных. Мы ищем способ сохранить эти элементы в базе данных и запросить «ближайший» элемент на основе расстояния между сгенерированным вектором объектов и теми, которые хранятся в базе данных. Точно, мы сталкиваемся со следующими проблемами:

  • Способ хранения всех элементов (возможно, в базе данных), чтобы мы могли быстро запросить элемент (ы), который является "ближайшим" к сгенерированные функции.
  • Способ определения собственного алгоритма для вычисления этого расстояния (что-то кроме евклидова расстояния)

PS: Проведя некоторое исследование, я обнаружил это - «Модуль PostgreSQL, реализующий тип данных куб для представления многомерных данных.»

Этот модуль предоставляет операторы для вычисления евклидова расстояния , Расстояние такси (L-1 metri c) и Чебышевское (L-inf metri c) расстояние между двумя кубиками a и b.

Но есть ограничение в 100 на количество измерений кубов. Кроме того, мы не можем использовать пользовательскую формулу расстояния.

Ну, это самое близкое, что я смог найти.

Буду очень признателен за любую помощь по этому поводу.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

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

Если вы используете Java и / или заинтересованы в Точность 100%, обратите внимание на PhTree , особенно на версию HD (с высокой яркостью). Это многомерный индекс в памяти, который должен быть способен построить индекс в 1M точек примерно за 10 секунд или около того. Он поддерживает различные функции расстояния, репозиторий содержит реализации евклидова и L1 расстояния. Вам может понадобиться машина с большим количеством оперативной памяти, хотя, я предполагаю (не измерено) около 5-10 ГБ на 1М точек?

Насколько я могу сказать, она превосходит KD-Trees и несколько быстрее, чем R * Trees (см. здесь для коллекции индексов). Я не тестировал его, но я предполагаю, что он не может конкурировать с индексами отжига, но в отличие от индексов отжига, он даст 100% правильные результаты. , поэтому добавление одной и той же координаты дважды перезапишет предыдущую запись. Простой способ обойти это - добавить дополнительное измерение с уникальным идентификатором. Это измерение, конечно, должно быть исключено из расчета расстояния.

Отказ от ответственности: я являюсь автором PH-Tree и библиотеки индексов TinSpin.

0 голосов
/ 14 апреля 2020

Взгляните на AnnDB

Это распределенная приблизительная база данных ближайших соседей, которая горизонтально масштабируется до миллионов многомерных векторов. Он поддерживает метрики L2, L1 и Cosine.

Отказ от ответственности: я являюсь автором AnnDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...