【AI知识点】余弦相似度(Cosine Similarity)

余弦相似度(Cosine Similarity)是一种用于衡量两个向量在方向上的相似程度的指标。它主要用于文本分析、自然语言处理(NLP)、推荐系统等任务中,能够衡量两个向量之间的相似性,而不受向量的长度(模)影响。

可对比 点积相似性(dot-product similarity)来学习

1. 余弦相似度的定义

余弦相似度通过计算两个向量之间的夹角的余弦值,来表示它们在向量空间中的相似性。数学上,两个向量的余弦相似度可以表示为:

cos ⁡ θ = A ⋅ B ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ B ∣ ∣ \cos \theta = \frac{\mathbf{A} \cdot \mathbf{B}}{||\mathbf{A}|| \cdot ||\mathbf{B}||} cosθ=ABAB

其中:

  • A ⋅ B \mathbf{A} \cdot \mathbf{B} AB 表示两个向量的点积。
  • ∣ ∣ A ∣ ∣ ||\mathbf{A}|| A ∣ ∣ B ∣ ∣ ||\mathbf{B}|| B 分别表示向量 A \mathbf{A} A B \mathbf{B} B 的模(即向量的长度)。
  • θ \theta θ 是两个向量之间的夹角。

余弦相似度的值范围在 [ − 1 , 1 ] [-1, 1] [1,1] 之间:

  • 1:表示两个向量的方向完全相同,夹角为0度(最大相似性)。
  • 0:表示两个向量正交,夹角为90度(完全不相关)。
  • -1:表示两个向量的方向完全相反,夹角为180度(完全不相似甚至是反相似,或者说完全对立,实际情况很少见)。

2. 余弦相似度的计算步骤

假设我们有两个向量 A = ( A 1 , A 2 , … , A n ) \mathbf{A} = (A_1, A_2, \dots, A_n) A=(A1,A2,,An) B = ( B 1 , B 2 , … , B n ) \mathbf{B} = (B_1, B_2, \dots, B_n) B=(B1,B2,,Bn),它们的余弦相似度的计算步骤如下:

  1. 计算点积
    点积(又称内积)是两个向量对应元素的乘积之和。公式为:
    A ⋅ B = A 1 × B 1 + A 2 × B 2 + ⋯ + A n × B n \mathbf{A} \cdot \mathbf{B} = A_1 \times B_1 + A_2 \times B_2 + \dots + A_n \times B_n AB=A1×B1+A2×B2++An×Bn

  2. 计算向量的模(长度)
    向量的模(也叫范数)表示向量的长度,计算公式为:
    ∣ ∣ A ∣ ∣ = A 1 2 + A 2 2 + ⋯ + A n 2 ||\mathbf{A}|| = \sqrt{A_1^2 + A_2^2 + \dots + A_n^2} A=A12+A22++An2

    同理, ∣ ∣ B ∣ ∣ ||\mathbf{B}|| B 的计算方式也是对 B \mathbf{B} B 的每个分量求平方和开平方。

  3. 计算余弦相似度
    将点积除以两个向量的模的乘积,得到两个向量之间的余弦相似度:
    cos ⁡ θ = A ⋅ B ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ B ∣ ∣ \cos \theta = \frac{\mathbf{A} \cdot \mathbf{B}}{||\mathbf{A}|| \cdot ||\mathbf{B}||} cosθ=ABAB


3. 余弦相似度的直观解释

余弦相似度本质上是衡量两个向量之间的夹角,而不是它们的长度。即使两个向量在长度上有很大差异,只要它们的方向接近(夹角接近于0),余弦相似度仍然会接近1。

例子:

假设有两个向量:

  • 向量 A = ( 1 , 2 , 3 ) \mathbf{A} = (1, 2, 3) A=(1,2,3)
  • 向量 B = ( 2 , 4 , 6 ) \mathbf{B} = (2, 4, 6) B=(2,4,6)

虽然这两个向量的长度不同,但它们的方向是完全一致的,因为 B \mathbf{B} B A \mathbf{A} A 的两倍。因此它们的余弦相似度为1,即它们的方向相同。

相比之下,向量的欧几里得距离(Euclidean Distance)则依赖于向量的大小。如果只计算欧几里得距离, A \mathbf{A} A B \mathbf{B} B 的距离会非常大,无法反映它们的相似性。因此,余弦相似度在这种情况下比欧几里得距离更适合衡量向量之间的相似性。


4. 余弦相似度的应用场景

a. 文本相似性

在自然语言处理(NLP)中,余弦相似度被广泛用于衡量两个文本之间的相似性。文本可以通过词袋模型(Bag-of-Words,BOW)或词嵌入模型(如Word2Vec)转换为向量表示。通过计算两个文本的余弦相似度,可以判断它们的相似程度。

b. 信息检索

在搜索引擎和信息检索系统中,文档和查询都可以被表示为向量。通过计算查询和文档向量之间的余弦相似度,系统可以评估文档与查询的相关性,从而排序返回最相关的文档。

c. 推荐系统

在推荐系统中,用户和物品通常被表示为嵌入向量。通过计算用户向量与物品向量的余弦相似度,系统可以推荐与用户兴趣最相关的物品。

d. 图像相似性

在图像处理任务中,图像特征可以被表示为向量。通过计算图像特征向量之间的余弦相似度,可以判断两幅图像的相似性。


5. 余弦相似度的优缺点

优点:

  1. 不依赖于向量的大小:余弦相似度只考虑向量的方向,而忽略它们的长度。因此,即使向量的长度不同,只要它们的方向一致,余弦相似度也可以很高。
  2. 计算效率高:余弦相似度的计算只需要点积和向量的模,相对于其他复杂的相似度度量方法(如KL散度等),计算较为简单高效。
  3. 适用于稀疏向量:在高维稀疏向量中(如词袋模型的文本表示),大部分分量为零,余弦相似度可以有效地衡量向量之间的相似性。

缺点:

  1. 不适合捕捉绝对差异:余弦相似度忽略了向量的长度,只考虑了方向。在某些应用中(如推荐系统中),物品的绝对评分差异可能是重要的,这时余弦相似度可能无法反映出这些差异。
  2. 对零向量不适用:如果其中一个向量是零向量(即所有分量都是0),则无法计算余弦相似度,因为除以零是无意义的。

6. 余弦相似度的计算示例

示例1:

假设有两个向量 A \mathbf{A} A B \mathbf{B} B

  • A = ( 1 , 0 , − 1 ) \mathbf{A} = (1, 0, -1) A=(1,0,1)
  • B = ( 1 , 1 , 0 ) \mathbf{B} = (1, 1, 0) B=(1,1,0)
  1. 计算点积:
    A ⋅ B = 1 × 1 + 0 × 1 + ( − 1 ) × 0 = 1 \mathbf{A} \cdot \mathbf{B} = 1 \times 1 + 0 \times 1 + (-1) \times 0 = 1 AB=1×1+0×1+(1)×0=1

  2. 计算向量的模:
    ∣ ∣ A ∣ ∣ = 1 2 + 0 2 + ( − 1 ) 2 = 2 ||\mathbf{A}|| = \sqrt{1^2 + 0^2 + (-1)^2} = \sqrt{2} A=12+02+(1)2 =2
    ∣ ∣ B ∣ ∣ = 1 2 + 1 2 + 0 2 = 2 ||\mathbf{B}|| = \sqrt{1^2 + 1^2 + 0^2} = \sqrt{2} B=12+12+02 =2

  3. 计算余弦相似度:
    cos ⁡ θ = 1 2 × 2 = 1 2 \cos \theta = \frac{1}{\sqrt{2} \times \sqrt{2}} = \frac{1}{2} cosθ=2 ×2 1=21

因此,向量 A \mathbf{A} A B \mathbf{B} B 之间的余弦相似度为 0.5 0.5 0.5,表示它们有一定程度的相似性。


示例2:

假设有两个文本向量:

  • 文本1的词袋表示为 A = ( 1 , 2 , 3 ) \mathbf{A} = (1, 2, 3) A=(1,2,3)
  • 文本2的词袋表示为 B = ( 2 , 4 , 6 ) \mathbf{B} = (2, 4, 6) B=(2,4,6)
  1. 计算点积
    A ⋅ B = 1 × 2 + 2 × 4 + 3 × 6 = 2 + 8 + 18 = 28 \mathbf{A} \cdot \mathbf{B} = 1 \times 2 + 2 \times 4 + 3 \times 6 = 2 + 8 + 18 = 28 AB=1×2+2×4+3×6=2+8+18=28

  2. 计算向量的模

    • 对于向量 A \mathbf{A} A
      ∣ ∣ A ∣ ∣ = 1 2 + 2 2 + 3 2 = 1 + 4 + 9 = 14 ||\mathbf{A}|| = \sqrt{1^2 + 2^2 + 3^2} = \sqrt{1 + 4 + 9} = \sqrt{14} A=12+22+32 =1+4+9 =14

    • 对于向量 B \mathbf{B} B
      ∣ ∣ B ∣ ∣ = 2 2 + 4 2 + 6 2 = 4 + 16 + 36 = 56 ||\mathbf{B}|| = \sqrt{2^2 + 4^2 + 6^2} = \sqrt{4 + 16 + 36} = \sqrt{56} B=22+42+62 =4+16+36 =56

  3. 计算余弦相似度
    cos ⁡ θ = 28 14 × 56 = 28 784 = 28 28 = 1 \cos \theta = \frac{28}{\sqrt{14} \times \sqrt{56}} = \frac{28}{\sqrt{784}} = \frac{28}{28} = 1 cosθ=14 ×56 28=784 28=2828=1

因此,两个向量的余弦相似度为1,表示它们的方向完全一致。这也反映了向量 B \mathbf{B} B 是向量 A \mathbf{A} A 的线性倍数( B = 2 × A \mathbf{B} = 2 \times \mathbf{A} B=2×A),因此它们在向量空间中的方向是相同的。


7. 总结

余弦相似度是一种常用的衡量两个向量之间相似度的指标,尤其在自然语言处理和信息检索等领域广泛应用。通过计算两个向量之间的夹角余弦值,余弦相似度能够捕捉它们在方向上的相似性,而不受向量长度的影响。对于稀疏的文本表示(如词袋模型(Bag-of-Words,BOW))和嵌入向量(Embedding Vector)(如Word2Vec、BERT生成的向量),余弦相似度提供了一种简单而有效的相似性度量方法。

余弦相似度是衡量两个非零向量之间相似度的度量方法,它是通过计算两个向量在方向上的相似度来进行的,其值介于-1和1之间。两个向量余弦相似度越高,表示它们之间的夹角越小,方向越相似。在文本分析、推荐系统等领域有广泛应用。 余弦相似度的计算公式为两个向量的点积除以它们各自模长的乘积。假设我们有两个向量A和B,则它们之间的余弦相似度可以表示为: cos(θ) = (A · B) / (||A|| * ||B||) 其中,A · B表示向量A和B的点积,||A||和||B||分别表示向量A和B的模长。 以下是一个简单的C语言实现示例: ```c #include <stdio.h> #include <math.h> // 计算向量的模长 double vector_magnitude(double *vector, int size) { double sum = 0.0; for (int i = 0; i < size; i++) { sum += vector[i] * vector[i]; } return sqrt(sum); } // 计算两个向量的点积 double dot_product(double *vectorA, double *vectorB, int size) { double sum = 0.0; for (int i = 0; i < size; i++) { sum += vectorA[i] * vectorB[i]; } return sum; } // 计算余弦相似度 double cosine_similarity(double *vectorA, double *vectorB, int size) { double dot = dot_product(vectorA, vectorB, size); double magnitudeA = vector_magnitude(vectorA, size); double magnitudeB = vector_magnitude(vectorB, size); return dot / (magnitudeA * magnitudeB); } int main() { double vectorA[] = {1, 2, 3}; double vectorB[] = {4, 5, 6}; int size = 3; double similarity = cosine_similarity(vectorA, vectorB, size); printf("Cosine Similarity: %f\n", similarity); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值