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.

한 가지 경고가 있다고합니다

사람들이 물건을 부수기 어렵게 만들기 위해 큐브 크기의 수는 100으로 제한됩니다. 더 큰 것이 필요한 경우 cubedata.h에 설정됩니다.

150 치수를 요구합니다. 약간의 합병증이 나타날 수 있습니다.


1
cubedata.h내 경험상 편집 할 수없는 치수가 130 개 이상입니다. Postgres는 행 당 인덱스 크기에 제한이 있으므로 각 숫자에 사용하는 바이트 수를 반으로 줄이면 범위 내에서 모든 doubles 또는 float8s를로 변경할 float4수 있습니다. 나는 약간의 테스트를했고 그 방법으로 더 많은 차원을 얻었고 IIRC는 150을 넘었지만 완전히 확신하지 못했습니다.
sudo

크기 제한과 같은 문제가 있었고 2048 제한을 가진 docker 이미지를 만들었습니다. hub.docker.com/r/expert/postgresql-large-cube
expert

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.