150次元空間での最近傍検索


13

可能なRDBMSのいずれかを使用してデータベースを作成したい。約150列のテーブルがあります。目的は、いくつかの他のオブジェクトの最近傍探索を実行することです。つまり、これは150次元空間のNNSです。

L1またはL2距離のような明らかな方法を使用しようとしましたが、もちろん、行数が多いテーブルの場合は時間がかかります。また、KDツリー(テストしていないことに注意してください)とPG-Stromを確認しようとしましたが、これらは、多くの次元を持つデータには適していません。

数学の方法(KD-treeなど)または技術的な方法(PG-Stromなど)を使用して、記述された検索の速度をどうにかして向上させることができますか?

NNSの速度を改善できるRDBMSを使用するようにします。しかし、MySQLとPostgreSQLは私にとって最も適切なDBMSです。


1
これらは他の問題です。別の質問をするだけ@ don-prog
Evan Carroll

回答:


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.

とはいえ、注意点が1つあります。

人々が物事を壊しにくくするために、キューブの次元数は100に制限されています。これは、もっと大きなものが必要な場合にcubedata.hで設定されます。

150の寸法を要求します。これにより、小さな問題が発生する可能性があります。


1
への編集cubedata.hは、私の経験では130次元を超えて機能しません。たぶん、あなたはまた、すべて変更することができますdouble秒かfloat8の拡張機能によfloat4Postgresはあなたがそれぞれの番号に使用するバイト数を半分にすることにより離れてから滞在することができあたりの行インデックスサイズに制限があるため、。私はいくつかのテストを行い、その方法でより多くの次元を取得しました。IIRCは150を超えましたが、完全にはわかりません。
sudo

寸法の制限で同じ問題があり、2048の制限でDocker
エキスパート

2

最初に次元削減を実行することを検討してください(例:主成分分析)。

次に、少数の次元でより高いパフォーマンスでNNを実行します。

必要に応じて、Pl / Rを使用してpostgres内でPCAを実行できます。



0

見てみましょうhttps://github.com/a-mma/AquilaDB JSONメタデータと一緒に特徴ベクトルを格納するためのベクトルデータベースです。RDBMSと一緒に保管し、メタデータを使用してデータ間の相互参照を維持してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.