দ্রুত নিকটতম প্রতিবেশী 150-মাত্রিক স্থান অনুসন্ধান করুন


13

আমি যে কোনও সম্ভাব্য আরডিবিএমএস ব্যবহার করে একটি ডাটাবেস তৈরি করতে চাই। এটিতে প্রায় 150 কলাম সহ একটি টেবিল থাকবে। উদ্দেশ্য হ'ল নিকটবর্তী অন্যান্য কিছু বস্তুর প্রতিবেশী অনুসন্ধান করা। সুতরাং এটি 150-মাত্রিক স্থানের একটি এনএনএস।

আমি ইতিমধ্যে L1 বা L2 দূরত্বের মতো কিছু স্পষ্ট পদ্ধতি ব্যবহার করার চেষ্টা করেছি তবে অবশ্যই অনেক সারিযুক্ত টেবিলগুলির জন্য এটি অনেক সময় নেয়। এছাড়াও আমি কেডি-ট্রি (নোট আমি এটি পরীক্ষা করেছিলাম না) এবং পিজি-স্ট্রোম দেখার চেষ্টা করেছি তবে অনেকগুলি মাত্রা সহ ডেটাগুলির জন্য এগুলি ভাল সমাধান নয়।

আমি কি কোনওভাবে গণিতের পদ্ধতিগুলি (কেডি-ট্রি এর মতো) বা প্রযুক্তি পদ্ধতি (পিজি-স্ট্রোমের মতো) ব্যবহার করে বর্ণিত অনুসন্ধানের গতি উন্নত করতে পারি?

আমি এমন কোনও আরডিবিএমএস ব্যবহার করার চেষ্টা করব যা এনএনএসের গতি উন্নত করতে দেয়। তবে মাইএসকিউএল এবং পোস্টগ্রিএসকিউএল আমার জন্য সবচেয়ে উপযুক্ত ডিবিএমএস।


1
এগুলি অন্যান্য সমস্যা। @ ডন-প্রগ্রে কেবল আরও একটি প্রশ্ন জিজ্ঞাসা করুন
ইভান ক্যারল

উত্তর:


17

PostgreSQL 9.6 ব্যবহার করে cube

প্রথমে কিউব এক্সটেনশানটি ইনস্টল করুন

CREATE EXTENSION cube;

এখন আমরা 50 টি মাত্রায় 100,000 পয়েন্ট সহ কিছু এন-ডাইমেনশনাল স্পেস তৈরি করব। এছাড়াও আমরা একটি জিআইএসটি সূচক যুক্ত করব।

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। এর সবগুলিই আমরা তৈরি জিআইএসটি সূচকটি ব্যবহার করতে পারি। যেমন,

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 এর সীমা রয়েছে। আপনার আরও বড় কিছু লাগলে এটি কিউবেডা.এতে সেট করা আছে।

আপনি 150 টি মাত্রা চাইবেন। এটি একটি সামান্য জটিলতা উপস্থাপন করতে পারে।


1
সম্পাদনাটি cubedata.hআমার অভিজ্ঞতার সাথে 130 টি মাত্রার কাজ করে না। হতে পারে আপনি এক্সটেনশনে সমস্ত doubleগুলি বা float8গুলি float4এগুলিতেও পরিবর্তন করতে পারেন , যেহেতু পোস্টগ্রিসের প্রতি সারি সূচক আকারের সীমা রয়েছে যা আপনি প্রতিটি সংখ্যায় কতগুলি বাইট ব্যবহার করেন তা অর্ধেক রেখে দূরে থাকতে পারবেন। আমি কিছু পরীক্ষা করেছি এবং সেভাবে আরও মাত্রা পেয়েছি এবং আইআইআরসি আমি পেরিয়েছি 150 পেরিয়েছি, তবে আমি পুরোপুরি নিশ্চিত নই।
সুডো

মাত্রা সীমার সাথে আমার একই সমস্যা ছিল এবং 2048 সীমা সহ ডকার চিত্র তৈরি করেছি: hub.docker.com/r/expert/postgresql-large-cube
বিশেষজ্ঞ

2

প্রথমে মাত্রা হ্রাস সম্পাদন বিবেচনা করুন (যেমন: মূল উপাদান উপাদান বিশ্লেষণ)।

তারপরে আপনি উচ্চতর পারফরম্যান্স সহ অল্প সংখ্যক মাত্রায় এনএন করছেন।

আপনি যদি প্রয়োজন হয় তবে পোস্টগ্রিজের ভিতরে পিসিএ করতে পিএল / আর ব্যবহার করতে পারেন।


0

এফএলএনএএন এবং ওপেনসিভিতে একবার দেখুন ।

দুর্ভাগ্যক্রমে আমি কোনও আরডিবিএমএস সিস্টেমে এর সংহতকরণ সম্পর্কে সচেতন নই। তবে পোস্টগ্রিসের সাথে রাসায়নিক কাঠামোর তথ্যের একীকরণের উদাহরণ রয়েছে। সুতরাং নীতিগতভাবে এটি করা যেতে পারে।


0

Https://github.com/a-mma/AquilaDB এ একবার দেখুন, এটি JSON মেটাডেটা সহ ফিচার ভেক্টরগুলি সঞ্চয় করা ভেক্টর ডাটাবেস। এটি আপনার আরডিবিএমএসের সাথে রাখুন এবং ডেটার মধ্যে ক্রস রেফারেন্স বজায় রাখতে মেটাডেটা ব্যবহার করবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.