Я хочу создать базу данных, используя любую из возможных СУБД. В нем будет таблица с примерно 150 столбцами. Цель состоит в том, чтобы выполнить поиск ближайшего соседа некоторых других объектов. Так что это NNS в 150-мерном пространстве.
Я уже пытался использовать некоторые очевидные методы, такие как расстояния L1 или L2, но, конечно, это занимает много времени для таблиц с большим количеством строк. Также я попытался взглянуть на KD-дерево (заметьте, я не тестировал его) и PG-Strom, но они не являются хорошим решением для данных с большим количеством измерений.
Можно ли как-то улучшить скорость описанного поиска, используя математические методы (например, KD-дерево) или технические методы (например, PG-Strom)?
Я постараюсь использовать любую СУБД, позволяющую повысить скорость работы NNS. Но MySQL и PostgreSQL являются наиболее подходящей для меня СУБД.
Ответы:
PostgreSQL 9.6 с использованием
cube
Сначала установите расширение куба
Теперь мы создадим некое n-мерное пространство с 100 000 точек в 50 измерениях. Кроме того, мы добавим индекс GIST.
Теперь мы сгенерируем одну точку и используем
<->
оператор, чтобы найти ближайшую точку, используя евклидово расстояние.PostgreSQL 9.6+ поддерживает другие дистанционные операторы
cube
. Все из которых могут использовать индекс GIST, который мы создали. А именно,Тем не менее, есть одна оговорка,
Вы просите 150 размеров. Это может представлять незначительное осложнение.
источник
cubedata.h
моему опыту, редактирование не работает после 130 измерений. Возможно, вы также можете изменить всеdouble
s илиfloat8
s в расширении наfloat4
, поскольку Postgres имеет ограничение на размер индекса для каждой строки, от которого вы можете отказаться, вдвое уменьшив количество байтов, которое вы используете для каждого числа. Я провел некоторое тестирование и таким образом получил больше измерений, и IIRC получил более 150, но я не совсем уверен.Попробуйте сначала выполнить уменьшение размера (например, Анализ основных компонентов).
Тогда вы делаете NN в небольшом количестве измерений с более высокой производительностью.
При необходимости вы можете использовать Pl / R для выполнения PCA внутри postgres.
источник
Посмотрите на FLANN и OpenCV .
К сожалению, я не знаю об интеграции этого в систему RDBMS. Но есть, например, интеграция информации о химической структуре с Posgres. Так что в принципе это можно сделать.
источник
Взгляните на https://github.com/a-mma/AquilaDB, это база данных векторов для хранения векторов объектов вместе с метаданными JSON. Держите его вместе с РСУБД и используйте метаданные для поддержки перекрестных ссылок между данными.
источник