Mysql

快速搜尋n維空間中最相似的對象

  • February 10, 2017

假設我們在 n 維空間中有一個點。所以我們有一個座標(n列)可以描述每個點的位置。

我們需要實現一個表格,用於快速搜尋最相似的點,即與所需點的距離最小的點。

例如數據庫中的點:

id  c1  c2  c3  c4  c5
1   5   19  42  12  16
2   3   23  38  15  12
3   14  21  32  33  1
4   12  29  21  24  5

如果我們想找到與座標點的最佳匹配:

c1 c2  c3  c4  c5
4  20  40  14  15

我們將獲得 id 為 1 和 2 的分數。

我們還有每個維度(列)的平均座標和每個點的向量,其中第一個元素 - 點與該維度中的平均座標差異最大的維度數,以及最後一個 - 點的維度數有最小的差異。也許它可以用於與所需點的距離最大的更快速的過濾點。

那麼我怎樣才能使用 MySQL 做這樣的事情呢?

我認為複合索引order by abs(cx - $mycx)可能是一個很好的解決方案,但我不能使用它,因為我將有超過 16 列需要包含在一個索引中。

任何幫助都會非常有用!

PostgreSQL 使用cube

使用 PostgreSQL ,使用我在您的其他問題中解釋cube副檔名變得非常容易……範例數據。

CREATE TABLE foo AS
SELECT *
FROM ( VALUES
 (1, cube(ARRAY[5 , 19, 42, 12, 16]) ),
 (2, cube(ARRAY[3 , 23, 38, 15, 12]) ),
 (3, cube(ARRAY[14, 21, 32, 33, 1 ]) ),
 (4, cube(ARRAY[12, 29, 21, 24, 5 ]) )
) AS t(id, c);

尋找距離…

SELECT
 id,
 c,
 c2,
 cube_distance(c,c2),
 rank() OVER (ORDER BY cube_distance(c,c2))
FROM foo
CROSS JOIN ( SELECT cube(ARRAY[4,20,40,14,15]) )
 AS t(c2)
ORDER BY cube_distance(c, c2);

輸出。

id |          c          |         c2          |  cube_distance   | rank 
----+---------------------+---------------------+------------------+------
 1 | (5, 19, 42, 12, 16) | (4, 20, 40, 14, 15) |  3.3166247903554 |    1
 2 | (3, 23, 38, 15, 12) | (4, 20, 40, 14, 15) | 4.89897948556636 |    2
 4 | (12, 29, 21, 24, 5) | (4, 20, 40, 14, 15) | 26.5706605111728 |    3
 3 | (14, 21, 32, 33, 1) | (4, 20, 40, 14, 15) | 26.8700576850888 |    4

引用自:https://dba.stackexchange.com/questions/158653