Bigquery中一对数组之间的余弦相似度

Sye*_*que 2 google-bigquery bigquery-standard-sql

我创建了一个表,其中包含一对 ID 和每个 ID 的坐标,以便我可以计算它们之间的成对余弦相似度。

桌子看起来像这样在此处输入图片说明

坐标的维度数目前为 128,但它可能会有所不同。但是在同一个表中,一对 ID 的数字维度总是相同的。

coord1coord2是具有浮点值的重复字段(数组)。

有没有办法计算它们之间的余弦相似度?

我的预期输出将包含三列id1id2cosine_similarity

Mik*_*ant 6

下面是 BigQuery 标准 SQL

#standardSQL
SELECT id1, id2, ( 
  SELECT 
    SUM(value1 * value2)/ 
    SQRT(SUM(value1 * value1))/ 
    SQRT(SUM(value2 * value2))
  FROM UNNEST(coord1) value1 WITH OFFSET pos1 
  JOIN UNNEST(coord2) value2 WITH OFFSET pos2 
  ON pos1 = pos2
  ) cosine_similarity
FROM `project.dataset.table`  
Run Code Online (Sandbox Code Playgroud)

下面是你玩的虚拟示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id1, [1.0, 2.0, 3.0, 4.0] coord1, 2 id2, [1.0, 2.0, 3.0, 4.0] coord2 UNION ALL
  SELECT 3, [2.0, 0.0, 1.0, 1.0, 0, 2.0, 1.0, 1.0], 4, [2.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0]
)
SELECT id1, id2, ( 
  SELECT 
    SUM(value1 * value2)/
    SQRT(SUM(value1 * value1))/ 
    SQRT(SUM(value2 * value2))
  FROM UNNEST(coord1) value1 WITH OFFSET pos1 
  JOIN UNNEST(coord2) value2 WITH OFFSET pos2 
  ON pos1 = pos2
  ) cosine_similarity
FROM `project.dataset.table`  
Run Code Online (Sandbox Code Playgroud)

结果

Row id1 id2 cosine_similarity    
1   1   2   1.0  
2   3   4   0.8215838362577491   
Run Code Online (Sandbox Code Playgroud)