Je veux créer une base de données en utilisant l'un des SGBDR possibles. Il aura un tableau avec environ 150 colonnes. L'objectif est d'effectuer la recherche du plus proche voisin de certains autres objets. C'est donc un NNS dans l'espace de 150 dimensions.
J'ai déjà essayé d'utiliser des méthodes évidentes comme les distances L1 ou L2 mais bien sûr, cela prend beaucoup de temps pour les tableaux avec de nombreuses lignes. J'ai également essayé de regarder l'arbre KD (notez que je ne l'ai pas testé) et PG-Strom mais ils ne sont pas une bonne solution pour les données à plusieurs dimensions.
Puis-je en quelque sorte améliorer la vitesse de la recherche décrite en utilisant des méthodes mathématiques (comme KD-tree) ou des méthodes techniques (comme PG-Strom)?
J'essaierai d'utiliser n'importe quel SGBDR qui permettra d'améliorer la vitesse du NNS. Mais MySQL et PostgreSQL sont le SGBD le plus approprié pour moi.
Réponses:
PostgreSQL 9.6 utilisation
cube
Installez d'abord l' extension du cube
Nous allons maintenant créer un espace à n dimensions avec 100 000 points dans 50 dimensions. De plus, nous ajouterons un index GIST.
Nous allons maintenant générer un seul point et utiliser l'
<->
opératrice pour trouver le point le plus proche en utilisant la distance euclédienne.PostgreSQL 9.6+ prend en charge d'autres opérateurs de distance
cube
. Tous ces éléments peuvent utiliser l'index GIST que nous avons créé. À savoir,Cela dit, il y a une mise en garde,
Vous demandez 150 dimensions. Cela peut présenter une complication mineure.
la source
cubedata.h
ne fonctionne pas au-delà de 130 dimensions selon mon expérience. Peut-être que vous pouvez également changer tous lesdouble
s oufloat8
s dans l'extensionfloat4
, car Postgres a une limite sur la taille d'index par ligne que vous pouvez éviter en réduisant de moitié le nombre d'octets que vous utilisez sur chaque numéro. J'ai fait quelques tests et obtenu plus de dimensions de cette façon, et l'IIRC j'ai dépassé 150, mais je ne suis pas totalement sûr.Envisagez d'effectuer une réduction de dimension en premier (par exemple, analyse des composants principaux).
Ensuite, vous faites NN dans un petit nombre de dimensions avec des performances plus élevées.
Vous pouvez utiliser Pl / R pour effectuer PCA à l'intérieur de postgres si nécessaire.
la source
Jetez un œil à FLANN et OpenCV .
Malheureusement, je ne suis pas au courant d'une intégration de cela dans un système SGBDR. Mais il y a par exemple l' intégration des informations sur la structure chimique avec Posgres. Donc, en principe, cela peut être fait.
la source
Jetez un œil à https://github.com/a-mma/AquilaDB, c'est une base de données vectorielles pour stocker les vecteurs de fonctionnalités avec les métadonnées JSON. Conservez-le avec votre SGBDR et utilisez des métadonnées pour maintenir la référence croisée entre les données.
la source