当前位置: 首页 > article >正文

【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生成的向量),余弦相似度提供了一种简单而有效的相似性度量方法。


http://www.kler.cn/news/330197.html

相关文章:

  • HCIP-HarmonyOS Application Developer 习题(四)
  • 5G-A和F5G-A,对于AI意味着什么?
  • 【MySQL】MVCC及其实现原理
  • (28)oracle数据迁移(容器)-部署包资源
  • Linux驱动开发(速记版)--设备树
  • 滚雪球学Oracle[2.3讲]:Oracle Listener配置与管理
  • 路由交换实验指南
  • MongoDB的安装与增删改查基本操作
  • Mars的xlog与Logan
  • JMeter中线程组、HTTP请求的常见参数解释
  • 欧科云链OKLink相约TOKEN2049:更全面、多元与安全
  • scrapy爬虫基础
  • n!尾随零的数量
  • PHP反射机制
  • 消息队列10:为RabbitMq添加连接池
  • Linux 下 select 详解
  • 微服务实战——平台属性
  • Visual studio2019+PCL1.11.1+win10
  • 畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
  • 媲美GPT-4o mini的小模型,Meta Llama 3.2模型全面解读!