150-आयामी अंतरिक्ष में त्वरित निकटतम पड़ोसी खोज


13

मैं किसी भी संभव RDBMS का उपयोग करके एक डेटाबेस बनाना चाहता हूं। इसमें एक टेबल होगी जिसमें लगभग 150 कॉलम होंगे। इसका उद्देश्य कुछ अन्य वस्तुओं की निकटतम पड़ोसी खोज करना है। तो यह 150-आयामी अंतरिक्ष में एक NNS है।

मैंने पहले से ही एल 1 या एल 2 दूरियों जैसे कुछ स्पष्ट तरीकों का उपयोग करने की कोशिश की, लेकिन निश्चित रूप से कई पंक्तियों वाली तालिकाओं के लिए बहुत समय लगता है। इसके अलावा मैंने केडी-ट्री को देखने की कोशिश की (ध्यान दें कि मैंने इसका परीक्षण नहीं किया था) और पीजी-स्ट्रॉम लेकिन वे कई आयामों के साथ डेटा के लिए एक अच्छा समाधान नहीं हैं।

क्या मैं किसी तरह गणित विधियों (जैसे केडी-ट्री) या तकनीकी विधियों (जैसे पीजी-स्ट्रोम) का उपयोग करके वर्णित खोज की गति में सुधार कर सकता हूं?

मैं किसी भी आरडीबीएमएस का उपयोग करने की कोशिश करूंगा जो एनएनएस की गति में सुधार करने की अनुमति देते हैं। लेकिन MySQL और PostgreSQL मेरे लिए सबसे उपयुक्त DBMS हैं।


1
ये अन्य समस्याएं हैं। बस एक और प्रश्न पूछें @ डॉन-प्रोग
इवान कैरोल

जवाबों:


17

PostgreSQL 9.6 का उपयोग कर cube

पहले क्यूब एक्सटेंशन स्थापित करें

CREATE EXTENSION cube;

अब हम 50 आयामों में 100,000 अंकों के साथ कुछ n- आयामी स्थान बनाएंगे। इसके अलावा हम GIST इंडेक्स जोड़ेंगे।

CREATE TEMP TABLE space_nd
AS
  SELECT i, cube(array_agg(random()::float)) AS c
  FROM generate_series(1,1e5) AS i
  CROSS JOIN LATERAL generate_series(1,50)
    AS x
  GROUP BY i;

CREATE INDEX ON space_nd USING gist ( c );
ANALYZE space_nd;

अब हम एकल बिंदु उत्पन्न करेंगे और <->यूकेलियन दूरी का उपयोग करके निकटतम बिंदु को खोजने के लिए ऑपरेटर का उपयोग करेंगे।

WITH points AS (
  SELECT cube(array_agg(random()::float)) AS c
  FROM generate_series(1,50)
    AS x
)
SELECT i,
  pg_typeof(space_nd.c),
  pg_typeof(points.c),
  cube_distance(space_nd.c, points.c)
FROM space_nd
CROSS JOIN points
ORDER BY space_nd.c <-> points.c
LIMIT 5;

PostgreSQL 9.6+ अन्य दूरी के ऑपरेटरों का समर्थन करता है cube। जिनमें से सभी हमारे द्वारा बनाए गए GIST इंडेक्स का उपयोग कर सकते हैं। अर्थात्,

a <-> b float8  Euclidean distance between a and b.
a <#> b float8  Taxicab (L-1 metric) distance between a and b.
a <=> b float8  Chebyshev (L-inf metric) distance between a and b.

कहा कि वहाँ एक चेतावनी है,

लोगों को चीजों को तोड़ने के लिए कठिन बनाने के लिए, क्यूब्स के आयामों की संख्या पर 100 की सीमा होती है। यदि आप कुछ बड़ा की जरूरत है यह cubedata.h में सेट किया गया है।

आप 150 आयाम मांगते हैं। यह एक मामूली जटिलता पेश कर सकता है।


1
cubedata.hमेरे अनुभव में पिछले 130 आयामों को संपादित करने का काम नहीं करता है। हो सकता है कि आप एक्सटेंशन में सभी doubles या float8s को भी बदल सकते हैं float4, क्योंकि Postgres की प्रति-पंक्ति अनुक्रमणिका आकार पर एक सीमा होती है कि आप प्रत्येक नंबर पर कितने बाइट्स का उपयोग करके हॉल्ट से दूर रह सकते हैं। मैंने कुछ परीक्षण किया और उस तरह से और अधिक आयाम प्राप्त किए, और IIRC मुझे पिछले 150 से मिला, लेकिन मैं पूरी तरह से निश्चित नहीं हूं।
सूडो

मुझे आयामों पर सीमा के साथ एक ही समस्या थी और 2048 की सीमा के साथ docker की
विशेषज्ञ

2

पहले आयाम में कमी करने पर विचार करें (उदाहरण के लिए। प्रमुख घटक विश्लेषण)।

तब आप उच्च प्रदर्शन के साथ छोटे आयामों में एनएन कर रहे हैं।

जरूरत पड़ने पर पोस्टग्रेज के अंदर पीसीए करने के लिए आप पीएल / आर का उपयोग कर सकते हैं।


0

FLANN और OpenCV पर एक नज़र डालें ।

दुर्भाग्य से मुझे आरडीबीएमएस सिस्टम में एकीकरण की जानकारी नहीं है। लेकिन उदाहरण के लिए Posgres के साथ रासायनिक संरचना की जानकारी का एकीकरण है । तो सिद्धांत रूप में यह किया जा सकता है।


0

Https://github.com/a-mma/AquilaDB पर एक नज़र डालें यह JSON मेटाडेटा के साथ फ़ीचर वैक्टर को संग्रहीत करने के लिए एक वेक्टर डेटाबेस है। इसे अपने RDBMS के साथ रखें और डेटा के बीच क्रॉस संदर्भ बनाए रखने के लिए मेटाडेटा का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.