Bigquery 中一对数组之间的余弦相似度
Cosine similarity between pair of arrays in Bigquery
我创建了一个 table,它有一对 ID 和每个 ID 的坐标,这样我就可以计算它们之间的成对余弦相似度。
table看起来像这样
坐标的维数目前为 128,但可能会有所不同。但是一对ID的维数在同一个table.
中总是相同的
coord1
和coord2
是浮点值的重复字段(数组)。
有没有办法计算它们之间的余弦相似度?
我的预期输出将包含三列,id1
、id2
和 cosine_similarity
。
以下适用于 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`
下面是供您使用的虚拟示例
#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`
结果
Row id1 id2 cosine_similarity
1 1 2 1.0
2 3 4 0.8215838362577491
我创建了一个 table,它有一对 ID 和每个 ID 的坐标,这样我就可以计算它们之间的成对余弦相似度。
table看起来像这样
坐标的维数目前为 128,但可能会有所不同。但是一对ID的维数在同一个table.
中总是相同的coord1
和coord2
是浮点值的重复字段(数组)。
有没有办法计算它们之间的余弦相似度?
我的预期输出将包含三列,id1
、id2
和 cosine_similarity
。
以下适用于 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`
下面是供您使用的虚拟示例
#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`
结果
Row id1 id2 cosine_similarity
1 1 2 1.0
2 3 4 0.8215838362577491