
BigQuery(BQ) 对于数据分析或处理非常有用。
它擅长处理海量数据。 它在短时间内返回汇总结果。
BQ 有一种有用的数据格式array。
当我们将数组视为向量时,我们可能需要向量的余弦相似度。
那么我们如何获得余弦相似度呢?
所以今天我介绍一下《如何在BigQuery中计算数组的余弦相似度》。
作者

阅读优势
你可以理解“如何在BigQuery中计算数组的余弦相似度”。 那么你不必担心相似性。
什么是余弦相似度
余弦相似度是两个向量之间相似度的度量。
余弦 cos
是三角函数之一。
在 0° 的情况下取 1,在 90° 的情况下取 0,在 180° 的情况下取 -1。
所以这意味着如果我们知道余弦的值,我们就可以得到一个角度。
如果 2 个向量之间的角度接近于零,则意味着 2 个向量相似。
所以余弦用作相似度。
Cosine similarity is a measure of similarity between two non-zero vectors of an inner product space.
Reference: Cosine similarity - Wikipedia
余弦相似度的公式如下。
![]() |
---|

数据
在计算之前,我们应该准备数据。
为了制作数组数据,我们可以使用我们在上一主题中创建的表。
您可以在 SQL 中添加 CREATE TABLE
,并创建表。
SQL
CREATE TABLE test.array_sample2 AS SELECT key, ARRAY_AGG(val) as val_array FROM test.array_sample GROUP BY key
结果
Row | key | val_array |
1 | a | 1 |
2 | ||
3 | ||
2 | b | 2 |
4 | ||
5 | ||
3 | c | 3 |
2 | ||
-1 |
如何计算BigQuery中数组的余弦相似度
为了在 BigQuery 中计算数组的余弦相似度,我们应该计算向量元素之间的乘积。
SQL如下。
SQL
SELECT t1.key AS key1, t2.key AS key2, ( SELECT SUM(value1 * value2)/ SQRT(SUM(value1 * value1))/ SQRT(SUM(value2 * value2)) FROM UNNEST(t1.val_array) AS value1 WITH OFFSET pos1 JOIN UNNEST(t2.val_array) AS value2 WITH OFFSET pos2 ON pos1 = pos2 ) AS cosine_similarity FROM test.array_sample2 AS t1, test.array_sample2 AS t2 ORDER BY key1, key2, cosine_similarity
它将数组分解为每个元素 bt UNNEST(array)
,并通过 WITH OFFSET pos
添加序号。
然后使用 pos
作为每个元素相乘的连接键。
结果如下。
结果
Row | key1 | key2 | cosine_similarity |
---|---|---|---|
1 | a | a | 1 |
2 | a | b | 0.9960238411 |
3 | a | c | 0.2857142857 |
4 | b | a | 0.9960238411 |
5 | b | b | 1 |
6 | b | c | 0.3585685828 |
7 | c | a | 0.2857142857 |
8 | c | b | 0.3585685828 |
9 | c | c | 1 |
向量 a 和 b 相似。 所以相似度很高。
矢量 c 面向不同的方向。 所以相似度很低。
结论
今天我解释了“如何在 BigQuery 中计算数组的余弦相似度”。
为了计算数组的余弦相似度,我们可以采取以下解决方案。
Point

UNNEST(array)
有点困难。还有一些关于 BigQuey 的其他文章。
如果您对它们感兴趣,请阅读它们。