PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgresql k-निकटतम पड़ोसी (KNN) बहुआयामी घन पर

PostgreSQL दूरी ऑपरेटर का समर्थन करता है <-> और जैसा कि मैं इसे समझता हूं, इसका उपयोग पाठ का विश्लेषण करने के लिए किया जा सकता है (pg_trgrm मॉड्यूल के साथ) और ज्यामिति डेटा प्रकार।

मुझे नहीं पता कि आप इसे 1 से अधिक आयामों के साथ कैसे उपयोग कर सकते हैं। हो सकता है कि आपको अपना खुद का डिस्टेंस फंक्शन परिभाषित करना पड़े या किसी तरह अपने डेटा को टेक्स्ट या ज्योमेट्री टाइप के साथ एक कॉलम में बदलना पड़े। उदाहरण के लिए यदि आपके पास 8 कॉलम (8-आयामी घन) वाली तालिका है:

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

आप इसे इसमें बदल सकते हैं:

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

और फिर एक कॉलम के साथ तालिका में:

c1
abababac

तब आप उपयोग कर सकते हैं (gist . बनाने के बाद) इंडेक्स ):

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

उदाहरण

नमूना डेटा बनाएं

-- 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)
);

इनपुट डेटा को टेक्स्ट में बदलें

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
);

यह आपको एक वेरिएबल trans_variable . देगा जहां सभी 8 आयाम संग्रहीत हैं:

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

|| . के बजाय आप निम्न सिंटैक्स का भी उपयोग कर सकते हैं (छोटा, लेकिन अधिक गुप्त):

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

अनुक्रमणिका जोड़ें

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

परीक्षण दूरी नोट:मैंने तालिका से एक पंक्ति का चयन किया है - 52;42;18;50;68;29;8;55 - और थोड़े बदले हुए मान का इस्तेमाल किया (42;42;18;52;98;29;8;55 ) दूरी का परीक्षण करने के लिए। बेशक, आपके परीक्षण डेटा में पूरी तरह से अलग मान होंगे, क्योंकि यह रैंडम मैट्रिक्स है।

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';

आप डिस्टेंस ऑपरेटर <-> या सिमिलियरिटी फंक्शन का उपयोग कर सकते हैं। दूरी =1 - समानता



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लेन-देन के बीच में केवल-पढ़ने के लिए लेन-देन संपत्ति नहीं बदल सकता

  2. पोस्टग्रेस्क्ल में कॉलम पर न्यूल सेट करने से प्रदर्शन में वृद्धि होती है?

  3. पायथन psycopg2 copy_from() डेटा लोड करने के लिए शून्य पूर्णांक मानों के लिए त्रुटि फेंकता है:DataError:पूर्णांक के लिए अमान्य इनपुट सिंटैक्स:

  4. Django-DB-माइग्रेशन:तालिका में परिवर्तन नहीं कर सकता क्योंकि इसमें ट्रिगर ईवेंट लंबित हैं

  5. PostgreSQL (psql) में सभी डेटाबेस का आकार प्राप्त करें