PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgresql k-nearest neighbor (KNN) pada kubus multidimensi

PostgreSQL mendukung operator jarak <-> dan seperti yang saya pahami, ini dapat digunakan untuk menganalisis teks (dengan modul pg_trgrm) dan geometri tipe data.

Saya tidak tahu bagaimana Anda bisa menggunakannya dengan lebih dari 1 dimensi. Mungkin Anda harus menentukan fungsi jarak Anda sendiri atau entah bagaimana mengonversi data Anda menjadi satu kolom dengan teks atau tipe geometri. Misalnya jika Anda memiliki tabel dengan 8 kolom (kubus 8 dimensi):

c1 c2 c3 c4 c5 c6 c7 c8
 1  0  1  0  1  0  1  2

Anda dapat mengubahnya menjadi:

c1 c2 c3 c4 c5 c6 c7 c8
 a  b  a  b  a  b  a  c

Dan kemudian ke tabel dengan satu kolom:

c1
abababac

Kemudian Anda dapat menggunakan (setelah membuat gist indeks ):

SELECT c1, c1 <-> 'ababab'
 FROM test_trgm 
 ORDER BY c1 <-> 'ababab';

Contoh

Buat data sampel

-- Create some temporary data
-- ! Note that table are created in tmp schema (change sql to your scheme) and deleted if exists !
drop table if exists tmp.test_data;

-- Random integer matrix 100*8 
create table tmp.test_data as (
   select 
      trunc(random()*100)::int as input_variable_1,
      trunc(random()*100)::int as input_variable_2, 
      trunc(random()*100)::int as input_variable_3,
      trunc(random()*100)::int as input_variable_4, 
      trunc(random()*100)::int as input_variable_5, 
      trunc(random()*100)::int as input_variable_6, 
      trunc(random()*100)::int as input_variable_7, 
      trunc(random()*100)::int as input_variable_8
   from 
      generate_series(1,100,1)
);

Ubah data masukan menjadi teks

drop table if exists tmp.test_data_trans;

create table tmp.test_data_trans as (
select 
   input_variable_1 || ';' ||
   input_variable_2 || ';' ||
   input_variable_3 || ';' ||
   input_variable_4 || ';' ||
   input_variable_5 || ';' ||
   input_variable_6 || ';' ||
   input_variable_7 || ';' ||
   input_variable_8 as trans_variable
from 
   tmp.test_data
);

Ini akan memberi Anda satu variabel trans_variable di mana semua 8 dimensi disimpan:

trans_variable
40;88;68;29;19;54;40;90
80;49;56;57;42;36;50;68
29;13;63;33;0;18;52;77
44;68;18;81;28;24;20;89
80;62;20;49;4;87;54;18
35;37;32;25;8;13;42;54
8;58;3;42;37;1;41;49
70;1;28;18;47;78;8;17

Alih-alih || operator Anda juga dapat menggunakan sintaks berikut (lebih pendek, tetapi lebih samar):

select 
   array_to_string(string_to_array(t.*::text,''),'') as trans_variable
from 
   tmp.test_data t

Tambahkan indeks

create index test_data_gist_index on tmp.test_data_trans using gist(trans_variable);

Jarak pengujianCatatan:Saya telah memilih satu baris dari tabel - 52;42;18;50;68;29;8;55 - dan menggunakan nilai yang sedikit diubah (42;42;18;52;98;29;8;55 ) untuk menguji jarak. Tentu saja, Anda akan memiliki nilai yang sama sekali berbeda dalam data pengujian Anda, karena ini adalah matriks RANDOM.

select 
   *, 
   trans_variable <->  '42;42;18;52;98;29;8;55' as distance,
   similarity(trans_variable, '42;42;18;52;98;29;8;55') as similarity,
from 
   tmp.test_data_trans 
order by
   trans_variable <-> '52;42;18;50;68;29;8;55';

Anda dapat menggunakan operator jarak <-> atau fungsi kesamaan. Jarak =1 - Kesamaan



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menyimpan objek JSON ke PostgreSQL menggunakan tipe data JSONB di dalam tabel dan driver JDBC PostgreSQL

  2. Membuat tautan hubungan di PostgreSQL melalui pgAdmin

  3. apakah ada yang mirip dengan column_id di postgresql?

  4. Nilai Kesalahan saat mengimpor data ke tabel postgres menggunakan psycopg2

  5. Bagaimana Now() Bekerja di PostgreSQL