Quero criar um banco de dados usando qualquer um dos RDBMS possíveis. Terá uma tabela com aproximadamente 150 colunas. O objetivo é realizar a pesquisa de vizinhos mais próximos de alguns outros objetos. Portanto, é um NNS no espaço 150-dimensional.
Eu já tentei usar alguns métodos óbvios, como distâncias L1 ou L2, mas é claro que leva muito tempo para tabelas com muitas linhas. Também tentei olhar para a árvore KD (note que não a testei) e PG-Strom, mas elas não são uma boa solução para dados com muitas dimensões.
Posso, de alguma forma, melhorar a velocidade da pesquisa descrita usando métodos matemáticos (como KD-tree) ou métodos técnicos (como PG-Strom)?
Vou tentar usar qualquer RDBMS que permita melhorar a velocidade do NNS. Mas MySQL e PostgreSQL são os DBMS mais apropriados para mim.
fonte
Respostas:
PostgreSQL 9.6 usando
cube
Primeiro instale a extensão do cubo
Agora vamos criar um espaço n-dimensional com 100.000 pontos em 50 dimensões. Além disso, adicionaremos um índice GIST.
Agora, geraremos um único ponto e usaremos o
<->
operador para encontrar o ponto mais próximo usando a distância euclediana.O PostgreSQL 9.6+ suporta outros operadores à distância
cube
. Tudo isso pode usar o índice GIST que criamos. Nomeadamente,Dito isto, há uma ressalva,
Você pede 150 dimensões. Isso pode apresentar uma pequena complicação.
fonte
cubedata.h
não funciona além das 130 dimensões na minha experiência. Talvez você também possa alterar todos osdouble
sfloat8
na extensão parafloat4
, uma vez que o Postgres tem um limite no tamanho do índice por linha do qual você pode ficar afastado pela metade de quantos bytes você usa em cada número. Fiz alguns testes e obtive mais dimensões dessa maneira, e o IIRC superei os 150, mas não tenho muita certeza.Considere executar a redução de dimensão primeiro (por exemplo, Análise de componentes principais).
Então você está executando o NN em um pequeno número de dimensões com maior desempenho.
Você pode usar o Pl / R para executar o PCA dentro do postgres, se necessário.
fonte
Dê uma olhada na FLANN e OpenCV .
Infelizmente, não estou ciente de uma integração disso em um sistema RDBMS. Mas há, por exemplo, integração de informações de estrutura química com o Posgres. Então, em princípio, isso pode ser feito.
fonte
Dê uma olhada em https://github.com/a-mma/AquilaDB , é um banco de dados vetorial para armazenar vetores de recursos junto com metadados JSON. Mantenha-o junto com seu RDBMS e use metadados para manter a referência cruzada entre dados.
fonte