数据库

如何在BigQuery中计算数组的余弦相似度

2023-02-23

Share this for your friends.

如何在BigQuery中计算数组的余弦相似度

如何在BigQuery中计算余弦相似度?


BigQuery(BQ) 对于数据分析或处理非常有用。

它擅长处理海量数据。 它在短时间内返回汇总结果。


BQ 有一种有用的数据格式array

当我们将数组视为向量时,我们可能需要向量的余弦相似度

那么我们如何获得余弦相似度呢?

所以今天我介绍一下如何在BigQuery中计算数组的余弦相似度

作者


中级工程师(AI、系统)。 擅长Python和SQL。

阅读优势

你可以理解“如何在BigQuery中计算数组的余弦相似度”。 那么你不必担心相似性。


什么是余弦相似度

what

余弦相似度是两个向量之间相似度的度量

余弦 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中数组的余弦相似度

how

为了在 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)”分解数组
  • 通过“WITH OFFSET pos”将数字添加到数组元素
  • 通过每个数组元素之间的乘法计算余弦相似度

  • 使用 UNNEST(array) 有点困难。


    BigQuery Book


    还有一些关于 BigQuey 的其他文章。

    如果您对它们感兴趣,请阅读它们。


    Share this for your friends.

    If you felt this article is useful, please share.

    にほんブログ村 IT技術ブログへ

    -数据库
    -

    © 2024 ITips