Quiero crear una base de datos usando cualquiera de los posibles RDBMS. Tendrá una tabla con aproximadamente 150 columnas. El objetivo es realizar la búsqueda de vecinos más cercanos de algunos otros objetos. Entonces es un NNS en el espacio de 150 dimensiones.
Ya intenté usar algunos métodos obvios como las distancias L1 o L2, pero, por supuesto, lleva mucho tiempo para las tablas con muchas filas. También traté de mirar el árbol KD (tenga en cuenta que no lo probé) y PG-Strom, pero no son una buena solución para los datos con muchas dimensiones.
¿De alguna manera puedo mejorar la velocidad de la búsqueda descrita utilizando métodos matemáticos (como KD-tree) o métodos tecnológicos (como PG-Strom)?
Intentaré usar cualquier RDBMS que permita mejorar la velocidad del NNS. Pero MySQL y PostgreSQL son los DBMS más apropiados para mí.
fuente
Respuestas:
PostgreSQL 9.6 usando
cube
Primero instale la extensión del cubo
Ahora crearemos un espacio n-dimensional con 100,000 puntos en 50 dimensiones. Además, agregaremos un índice GIST.
Ahora generaremos un solo punto y usaremos el
<->
operador para encontrar el punto más cercano usando la distancia euclediana.PostgreSQL 9.6+ es compatible con otros operadores de distancia
cube
. Todo lo cual puede usar el índice GIST que creamos. A saber,Dicho esto, hay una advertencia:
Pides 150 dimensiones. Eso puede presentar una complicación menor.
fuente
cubedata.h
no funciona más allá de 130 dimensiones en mi experiencia. Tal vez también pueda cambiar todos losdouble
s ofloat8
s en la extensiónfloat4
, ya que Postgres tiene un límite en el tamaño del índice por fila del que puede alejarse reduciendo a la mitad la cantidad de bytes que usa en cada número. Hice algunas pruebas y obtuve más dimensiones de esa manera, y IIRC superé 150, pero no estoy totalmente seguro.Considere realizar primero la reducción de dimensiones (p. Ej., Análisis de componentes principales).
Entonces estás haciendo NN en un pequeño número de dimensiones con un mayor rendimiento.
Puede usar Pl / R para realizar PCA dentro de postgres si es necesario.
fuente
Echa un vistazo a FLANN y OpenCV .
Lamentablemente, no tengo conocimiento de una integración de eso en un sistema RDBMS. Pero hay, por ejemplo, integración de información de estructura química con Posgres. Entonces, en principio, esto se puede hacer.
fuente
Eche un vistazo a https://github.com/a-mma/AquilaDB , es una base de datos de vectores para almacenar vectores de características junto con metadatos JSON. Manténgalo junto con su RDBMS y use metadatos para mantener la referencia cruzada entre los datos.
fuente