Chcę utworzyć bazę danych przy użyciu dowolnego z możliwych RDBMS. Będzie miał tabelę z około 150 kolumnami. Celem jest przeszukanie najbliższych sąsiadów niektórych innych obiektów. Jest to więc NNS w 150-wymiarowej przestrzeni.
Próbowałem już użyć oczywistych metod, takich jak odległości L1 lub L2, ale oczywiście zajmuje dużo czasu dla tabel z wieloma wierszami. Próbowałem też spojrzeć na drzewo KD (uwaga, że go nie testowałem) i PG-Strom, ale nie są one dobrym rozwiązaniem dla danych o wielu wymiarach.
Czy mogę w jakiś sposób poprawić szybkość opisywanego wyszukiwania za pomocą metod matematycznych (takich jak drzewo KD) lub metod technicznych (takich jak PG-Strom)?
Spróbuję użyć dowolnego RDBMS, który pozwoli poprawić prędkość NNS. Ale MySQL i PostgreSQL są dla mnie najbardziej odpowiednim DBMS.
źródło
Odpowiedzi:
Korzystanie z PostgreSQL 9.6
cube
Najpierw zainstaluj rozszerzenie kostki
Teraz stworzymy n-wymiarową przestrzeń z 100 000 punktów w 50 wymiarach. Dodatkowo dodamy indeks GIST.
Teraz wygenerujemy pojedynczy punkt i użyjemy
<->
operatora, aby znaleźć najbliższy punkt na podstawie odległości eukledowskiej.PostgreSQL 9.6+ obsługuje innych operatorów odległości
cube
. Wszystkie z nich mogą korzystać z utworzonego przez nas indeksu GIST. Mianowicie,Powiedział, że jest jedno zastrzeżenie,
Pytasz o 150 wymiarów. Może to stanowić drobną komplikację.
źródło
cubedata.h
mojego doświadczenia wynika, że edycja do nie działa poza 130 wymiarami. Być może możesz również zmienić wszystkiedouble
s lubfloat8
s rozszerzeniafloat4
, ponieważ Postgres ma limit wielkości indeksu na wiersz, od którego możesz się trzymać, zmniejszając o połowę liczbę bajtów używanych na każdej liczbie. Przeprowadziłem testy i uzyskałem w ten sposób więcej wymiarów, a IIRC przekroczyłem 150, ale nie jestem do końca pewien.Rozważ najpierw wykonanie redukcji wymiarów (np. Analiza zasad składowych).
Więc robisz NN w niewielkiej liczbie wymiarów z wyższą wydajnością.
W razie potrzeby można użyć Pl / R do wykonania PCA wewnątrz postgresu.
źródło
Spójrz na FLANN i OpenCV .
Niestety nie jestem świadom integracji tego systemu z systemem RDBMS. Ale istnieje na przykład integracja informacji o strukturze chemicznej z Posgres. Zasadniczo można to zrobić.
źródło
Spójrz na https://github.com/a-mma/AquilaDB jest to wektorowa baza danych do przechowywania wektorów cech wraz z metadanymi JSON. Zachowaj go wraz z RDBMS i używaj metadanych, aby zachować odniesienie między danymi.
źródło