Ich möchte eine Datenbank mit einem der möglichen RDBMS erstellen. Es wird eine Tabelle mit ungefähr 150 Spalten haben. Das Ziel besteht darin, die Suche nach dem nächsten Nachbarn einiger anderer Objekte durchzuführen. Es ist also ein NNS im 150-dimensionalen Raum.
Ich habe bereits versucht, einige offensichtliche Methoden wie L1- oder L2-Abstände zu verwenden, aber für Tabellen mit vielen Zeilen dauert es natürlich viel Zeit. Ich habe auch versucht, den KD-Baum (beachten Sie, dass ich ihn nicht getestet habe) und PG-Strom zu betrachten, aber sie sind keine gute Lösung für Daten mit vielen Dimensionen.
Kann ich die Geschwindigkeit der beschriebenen Suche mithilfe von mathematischen Methoden (wie KD-Tree) oder technischen Methoden (wie PG-Strom) irgendwie verbessern?
Ich werde versuchen, jedes RDBMS zu verwenden, mit dem die Geschwindigkeit des NNS verbessert werden kann. Aber MySQL und PostgreSQL sind für mich das am besten geeignete DBMS.
quelle
Antworten:
PostgreSQL 9.6 mit
cube
Installieren Sie zuerst die Cube-Erweiterung
Jetzt werden wir einen n-dimensionalen Raum mit 100.000 Punkten in 50 Dimensionen erstellen. Zusätzlich fügen wir einen GIST-Index hinzu.
Jetzt werden wir einen einzelnen Punkt erzeugen und den
<->
Operator verwenden, um den nächsten Punkt unter Verwendung der eukledianischen Entfernung zu finden.PostgreSQL 9.6+ unterstützt andere Entfernungsoperatoren über
cube
. Alle können den von uns erstellten GIST-Index verwenden. Nämlich,Das heißt, es gibt eine Einschränkung,
Sie fragen nach 150 Dimensionen. Dies kann eine geringfügige Komplikation darstellen.
quelle
cubedata.h
funktioniert nach meiner Erfahrung nicht über 130 Dimensionen hinaus. Möglicherweise können Sie auch alledouble
s oderfloat8
s in der Erweiterung in ändernfloat4
, da Postgres eine Beschränkung für die Indexgröße pro Zeile hat, die Sie vermeiden können, indem Sie die Anzahl der für jede Zahl verwendeten Bytes halbieren. Ich habe einige Tests durchgeführt und auf diese Weise mehr Dimensionen erhalten, und IIRC habe ich über 150 erreicht, bin mir aber nicht ganz sicher.Ziehen Sie zunächst eine Dimensionsreduzierung in Betracht (z. B. Prinzipielle Komponentenanalyse).
Dann machen Sie NN in einer kleinen Anzahl von Dimensionen mit höherer Leistung.
Sie können Pl / R verwenden, um bei Bedarf eine PCA in Postgres durchzuführen.
quelle
Schauen Sie sich FLANN und OpenCV an .
Leider ist mir keine Integration in ein RDBMS-System bekannt. Aber es gibt zum Beispiel die Integration chemischer Strukturinformationen mit Posgres. Im Prinzip kann dies also getan werden.
quelle
Schauen Sie sich https://github.com/a-mma/AquilaDB an. Es handelt sich um eine Vektordatenbank zum Speichern von Feature-Vektoren zusammen mit JSON-Metadaten. Behalten Sie es zusammen mit Ihrem RDBMS bei und verwenden Sie Metadaten, um den Querverweis zwischen Daten aufrechtzuerhalten.
quelle