Saya ingin membuat database menggunakan RDBMS yang ada. Ini akan memiliki tabel dengan sekitar 150 kolom. Tujuannya adalah untuk melakukan pencarian tetangga terdekat dari beberapa objek lain. Jadi itu adalah NNS dalam ruang 150 dimensi.
Saya sudah mencoba menggunakan beberapa metode yang jelas seperti jarak L1 atau L2 tapi tentu saja butuh banyak waktu untuk tabel dengan banyak baris. Saya juga mencoba melihat pada KD-tree (perhatikan saya tidak mengujinya) dan PG-Strom tetapi mereka bukan solusi yang baik untuk data dengan banyak dimensi.
Bisakah saya meningkatkan kecepatan pencarian yang dijelaskan menggunakan metode matematika (seperti KD-tree) atau metode teknologi (seperti PG-Strom)?
Saya akan mencoba menggunakan RDBMS yang memungkinkan untuk meningkatkan kecepatan NNS. Tetapi MySQL dan PostgreSQL adalah DBMS yang paling tepat untuk saya.
sumber
Jawaban:
PostgreSQL 9.6 menggunakan
cube
Pertama instal ekstensi kubus
Sekarang kita akan membuat beberapa ruang n-dimensi dengan 100.000 poin dalam 50 dimensi. Selain itu kami akan menambahkan indeks GIST.
Sekarang kita akan menghasilkan satu titik dan menggunakan
<->
operater untuk menemukan titik terdekat menggunakan jarak Eucledian.PostgreSQL 9.6+ mendukung operator jarak jauh lainnya
cube
. Semuanya dapat menggunakan indeks GIST yang kami buat. Yaitu,Yang mengatakan ada satu peringatan,
Anda meminta 150 dimensi. Itu mungkin menimbulkan komplikasi kecil.
sumber
cubedata.h
tidak berfungsi melebihi 130 dimensi dalam pengalaman saya. Mungkin Anda juga dapat mengubah semuadouble
s ataufloat8
s di ekstensifloat4
, karena Postgres memiliki batasan ukuran indeks per baris yang dapat Anda hindari dengan membagi dua byte yang Anda gunakan pada setiap angka. Saya melakukan beberapa pengujian dan mendapatkan lebih banyak dimensi dengan cara itu, dan IIRC saya melewati 150, tapi saya tidak sepenuhnya yakin.Pertimbangkan untuk melakukan pengurangan dimensi terlebih dahulu (mis. Analisis Komponen Utama).
Maka Anda melakukan NN dalam sejumlah kecil dimensi dengan kinerja yang lebih tinggi.
Anda dapat menggunakan Pl / R untuk melakukan PCA di dalam postgres jika perlu.
sumber
Lihatlah FLANN dan OpenCV .
Sayangnya saya tidak mengetahui integrasi itu ke dalam sistem RDBMS. Tetapi ada misalnya integrasi informasi struktur kimia dengan Posgres. Jadi pada prinsipnya ini bisa dilakukan.
sumber
Lihatlah https://github.com/a-mma/AquilaDB, ini adalah basis data vektor untuk menyimpan Vektor Fitur bersama dengan JSON Metadata. Tetap ikuti RDBMS Anda dan gunakan metadata untuk mempertahankan referensi silang antara data.
sumber