在数据分析领域,余弦相似度用于度量内积空间中两个非零向量之间的相似性。它等于这两个向量间夹角的余弦值,即向量点积除以它们长度的乘积。因此,余弦相似度与向量的大小无关,仅与它们的夹角有关。余弦相似度总是属于区间,例如,两个成比例的矢量的余弦相似度为 1,两个正交的矢量的相似度为 0,两个相反的矢量的相似度为-1。 在某些情况下,矢量的分量值不能为负,在这种情况下,余弦相似度的边界为 。

例如,在信息检索和文本挖掘中,每个单词都对应一个独特的坐标。文档由其中单词出现频率的向量表示。因此,我们可以利用余弦相似度来衡量两篇文档在主题上的相似度,而这与文档的长度无关。

在数据挖掘领域,该技术还被用于测量聚类内的内聚力。

余弦相似度的一个优势在于计算复杂度较低,尤其是对于稀疏向量,因为它只考虑非零坐标。

余弦相似度也被称为 Orchini 相似度和 Tanimoto 系数。而 Otsuka–Ochiai 相似度(将在下文讨论)是一种应用于二进制数据的余弦相似度。

定义

两个非零向量的余弦值可以通过欧氏点积公式求出:

A ⋅ B = ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ cos ⁡ θ A\cdot B=||A|| ||B|| \cos{\theta} AB=∣∣A∣∣∣∣B∣∣cosθ

考虑两个 n 维的属性向量 A 和 B,它们的余弦相似度 cos(θ) 可以用它们的点积和大小(模)来表示,计算公式为

c o s i n e _ s i m i l a r i t y = S c ( A , B ) : = cos ⁡ ( θ ) = A ⋅ B ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ = ∑ i = 1 n A i B i ∑ i = 1 n A i 2 ⋅ ∑ i = 1 n B i 2 cosine\_similarity=S_c(A, B):=\cos{(\theta)} = \frac{A\cdot B}{||A|| ||B||}=\frac{\sum^{n}_{i=1}{A_iB_i}}{\sqrt{\sum^{n}_{i=1}{A_i^2}}\cdot \sqrt{\sum^{n}_{i=1}{B_i^2}}} cosine_similarity=Sc(A,B):=cos(θ)=∣∣A∣∣∣∣B∣∣AB=i=1nAi2 i=1nBi2 i=1nAiBi

其中, A i A_i Ai B i B_i Bi分别是向量A 和B 的第 i 个分量。

所计算出的相似度值在 -1(代表完全相反)至 1(代表完全相同)之间变化,其中 0 代表两向量正交或无相关性,而中间的数值表示不同程度的相似性或不相似性。

对于文本匹配,属性向量A和B通常是文档的词频向量。余弦相似度可以看作是比较过程中规范化文档长度的方法。在信息检索的情况下,两个文档的余弦相似度范围为 ,因为术语频率不能为负。使用 TF-IDF 权重时也是如此。两个词频向量之间的角度不能大于 90°。

如果属性向量是通过减去其均值来归一化的(即中心化),这种方法称为中心余弦相似度,它与皮尔逊相关系数类似。对于居中的示例,

i f A = [ A 1 , A 2 ] , t h e n A ‾ = [ A 1 + A 2 2 , A 1 + A 2 2 ] T , s o A − A ‾ = [ A 1 − A 2 2 , − A 1 + A 2 2 ] T . if A= [A_1, A_2], then \overline{A} = [\frac{A_1+A_2}{2}, \frac{A_1+A_2}{2}]^T,\\ so A -\overline{A} = [\frac{A_1-A_2}{2}, \frac{-A_1+A_2}{2}]^T. ifA=[A1,A2],thenA=[2A1+A2,2A1+A2]T,soAA=[2A1A2,2A1+A2]T.

余弦距离

所谓的余弦距离通常指的是余弦相似度在正空间中的补数,具体来说

c o s i n e _ d i s t a n c e = D c ( A , B ) : = 1 − S c ( A , B ) . cosine\_distance=D_c(A, B):=1-S_c(A, B). cosine_distance=Dc(A,B):=1Sc(A,B).

值得注意的是,余弦距离并非真正的距离度量,因为它不满足三角不等式的特性,或者更正式地说,是施瓦茨不等式,并且违反了重合公理。了解这一点的一种方法是注意余弦距离是向量 L 2 L_2 L2归一化的平方欧几里得距离的一半,而平方欧几里得距离也不满足三角形不等式。为了在保持相同顺序的同时修复三角形不等式性质,必须转换为角距离或欧几里得距离。或者,对角距离起作用的三角不等式可以直接用余弦表示;见下文。

角距离和相似度

任意两个向量A和B之间的归一化角度,称为角距离,是一个正式的距离度量,可以从余弦相似度计算出来。然后,可以使用角距离度量的补码来定义边界在 0 和 1 之间(含 0 和 1)的角度相似度函数。

当矢量元素可能是正的或负的时:

a n g u l a r _ d i s a t a n c e = D θ : = arccos ⁡ ( c o s i n e _ s i m i l a r i t y ) π = θ π angular\_disatance=D_\theta :=\frac{\arccos{(cosine\_similarity)}}{\pi} = \frac{\theta}{\pi} angular_disatance=Dθ:=πarccos(cosine_similarity)=πθ

a n g u l a r _ s i m i l a r i t y = S θ : = 1 − a n g u l a r _ d i s a t a n c e = 1 − θ π angular\_similarity =S_\theta :=1-angular\_disatance = 1 - \frac{\theta}{\pi} angular_similarity=Sθ:=1angular_disatance=1πθ

或者,如果向量元素始终为正:

a n g u l a r _ d i s a t a n c e = D θ : = 2 ⋅ arccos ⁡ ( c o s i n e _ s i m i l a r i t y ) π = 2 θ π angular\_disatance=D_\theta :=\frac{2\cdot \arccos{(cosine\_similarity)}}{\pi} = \frac{2\theta}{\pi} angular_disatance=Dθ:=π2arccos(cosine_similarity)=π2θ

a n g u l a r _ s i m i l a r i t y = S θ : = 1 − a n g u l a r _ d i s a t a n c e = 1 − 2 θ π angular\_similarity =S_\theta :=1-angular\_disatance = 1 - \frac{2\theta}{\pi} angular_similarity=Sθ:=1angular_disatance=1π2θ

不幸的是,计算反余弦 (arccos) 函数的速度很慢,这使得使用角距离比使用上面更常见(但不是公制)余弦距离的计算成本更高。

L 2 L_2 L2归一化欧几里得距离

余弦距离的另一个有效代理可以通过对向量进行归一化,然后应用正态欧几里得距离来获得。使用这种技术,首先将每个向量中的每项除以向量的大小,从而产生单位长度的向量。然后,任意两个向量端点上的欧几里得距离是一个适当的度量,它给出了与余弦距离(欧几里得距离的单调变换;见下文)相同的顺序,用于任何向量的比较,并且进一步避免了产生适当度量所需的潜在昂贵的三角运算。一旦发生归一化,向量空间就可以与任何欧几里得空间可用的各种技术一起使用,特别是标准降维技术。这种归一化的形式距离通常用于许多深度学习算法中。

Otsuka–Ochiai 系数

在生物学中,有一个类似的概念,称为大冢-落合系数,以大塚弥之助(也拼写为大塚弥之助,日语:大塚弥之助)和落合明(日语:落合明)命名的大冢-落合系数,可以表示为:

K = ∣ A ∩ B ∣ ∣ A ∣ × ∣ B ∣ K=\frac{|A\cap B|}{\sqrt{|A|\times |B|}} K=A×B AB

这里 A和 B是集合,并且A是 |A|中的元素数。如果集合表示为位向量,则可以看到大冢-落合系数与余弦相似度相同。

在最近的一本书中,该系数被错误地归因于另一位姓大冢的日本研究人员。之所以出现这种混淆,是因为在1957年,落合明(Akira Ochiai)引用了Ikuso Hamai(日语:浜井生三)的一篇文章,将系数仅归因于大冢(没有提到名字),而后者又引用了大冢弥之介(Yanosuke Otsuka)1936年的原始文章。它与戈弗雷·汤姆森(Godfrey Thomson)引入的乐谱相同。

属性

余弦相似性最值得注意的特性是,它反映了单个向量维度的相对比较,而不是绝对比较。对于任何常数和向量,向量和是最相似的。因此,该度量最适合频率比绝对值更重要的数据;值得注意的是,文档中的术语频率。然而,最近以信息论为基础的指标,如Jensen-Shannon、SED和三角发散,已被证明至少在某些上下文中改善了语义。

余弦相似度与欧几里得距离有关,如下所示。用通常的 表示欧几里得距离,并观察到

∣ ∣ A − B ∣ ∣ 2 = ( A − B ) ⋅ ( A − B ) = ∣ ∣ A ∣ ∣ 2 + ∣ ∣ B ∣ ∣ 2 − 2 ( A ⋅ B ) (极化身份) ||A-B||^2=(A-B)\cdot (A-B)=||A||^2+||B||^2-2(A\cdot B) (极化身份) ∣∣AB2=(AB)(AB)=∣∣A2+∣∣B22(AB)(极化身份)

通过扩展。当 A 和 B 归一化为单位长度时,此表达式等于

2 ( 1 − cos ⁡ ( A , B ) ) 2(1-\cos{(A, B)}) 2(1cos(A,B))

简而言之,余弦距离可以用欧几里得距离表示为

D C ( A , B ) = ∣ ∣ A − B ∣ ∣ 2 2 w h e n ∣ ∣ A ∣ ∣ 2 = ∣ ∣ B ∣ ∣ 2 = 1 D_C(A, B) = \frac{||A-B||^2}{2} when ||A||^2=||B||^2 = 1 DC(A,B)=2∣∣AB2when∣∣A2=∣∣B2=1

欧几里得距离称为和弦距离(因为它是单位圆上弦的长度),它是向量之间的欧几里得距离,这些向量被归一化为其中平方值的单位和。

零分布: 对于既可以是负数也可以是正数的数据,余弦相似度的零分布是两个独立的随机单位向量的点积的分布。该分布的均值为零,方差为 (其中 是维数),尽管分布在 -1 和 +1 之间,但随着分布的变大,分布越来越接近正态分布。其他类型的数据,例如仅采用值 0 或 1 的比特流,空分布采用不同的形式,并且可能具有非零均值。

余弦相似度的三角不等式

常规的角度三角不等式(即单位超球面上的弧长)提供了以下关系

∣ ∠ A C − ∠ C B ∣ ≤ ∠ A B ≤ A C + ∠ C B | \angle AC-\angle CB| \leq \angle AB \leq AC + \angle CB ∣∠ACCBABAC+CB

由于余弦函数随着 [0, π] 弧度中的角度的增加而减小,因此当我们取每个值的余弦时,这些不等式的意义是相反的:

cos ⁡ ( ∠ A C − ∠ C V ) ≥ cos ⁡ ( ∠ A B ) ≥ cos ⁡ ( ∠ A C + ∠ C B ) \cos{(\angle AC-\angle CV)} \geq\cos{(\angle AB)}\geq\cos{(\angle AC + \angle CB)} cos(ACCV)cos(AB)cos(AC+CB)

利用余弦的加法和减法公式,这两个不等式可以重写为仅使用原始余弦值的形式

cos ⁡ ( A , C ) ⋅ cos ⁡ ( C , B ) + ( 1 − cos ⁡ ( A , C ) 2 ) ⋅ ( 1 − cos ⁡ ( C , B ) 2 ) ≥ cos ⁡ ( A , B ) , cos ⁡ ( A , B ) ≥ cos ⁡ ( A , C ) ⋅ cos ⁡ ( C , B ) − ( 1 − cos ⁡ ( A , C ) 2 ) ⋅ ( 1 − cos ⁡ ( C , B ) 2 ) . \cos{(A, C)}\cdot \cos{(C, B)}+\sqrt{(1-\cos{(A, C)}^2)\cdot(1-\cos{(C, B)}^2) } \geq \cos(A, B),\\ \cos(A, B)\geq\cos(A, C)\cdot \cos(C, B) - \sqrt{(1-\cos{(A, C)}^2)\cdot(1-\cos{(C, B)}^2) }. cos(A,C)cos(C,B)+(1cos(A,C)2)(1cos(C,B)2) cos(A,B),cos(A,B)cos(A,C)cos(C,B)(1cos(A,C)2)(1cos(C,B)2) .

如果已知对象 A 和 C 之间的相似度,那么这种形式的三角不等式可以用来确定对象 A 和 B 之间的最小和最大相似度。例如,这用于度量数据索引,但也用于加速球面 k 均值聚类,就像欧几里得三角形不等式用于加速常规 k 均值一样。

软余弦测量

软余弦或称作“软”相似度,是在计算两个向量之间的相似度时考虑特征对之间相似性的一种方法。传统的余弦相似性认为向量空间模型(VSM)的特征是独立的或完全不同的,而软余弦度量则考虑VSM中特征的相似性,这有助于推广余弦(和软余弦)的概念以及(软)相似性的概念。

以自然语言处理(NLP)为例,其中特征间的相似性通常很直观。例如,单词、n-gram 或句法 n-gram 这些特征可能具有高度相似性,尽管它们在 VSM 中正式被视为不同的特征。例如,单词“play”和“game”是不同的单词,因此映射到 VSM 中的不同点;然而,它们在语义上是相关的。在 n-gram 或句法 n-gram 的情况下,可以应用 Levenshtein 距离(实际上,Levenshtein 距离也可以应用于单词)。

为了计算软余弦,矩阵 s 用于表示特征之间的相似性。它可以通过 Levenshtein 距离、WordNet 相似性或其他相似性度量来计算。然后我们乘以这个矩阵。

给定两个 N 维向量a 和b ,软余弦相似度的计算公式如下:

s o f t _ c o s i n e 1 ( a , b ) = ∑ i , j N s i , j a i b j ∑ i , j N s i , j a i a j ∑ i , j N s i , j b i b j soft\_cosine_1(a, b)=\frac{\sum^N_{i,j}{s_{i, j}a_ib_j}}{\sqrt{\sum^N_{i,j}{s_{i, j}a_ia_j}}\sqrt{\sum^N_{i,j}{s_{i, j}b_ib_j}}} soft_cosine1(a,b)=i,jNsi,jaiaj i,jNsi,jbibj i,jNsi,jaibj

其中 s i j s_{ij} sij = 相似性(特征,特征ij)。

如果特征之间没有相似性( i ≠ j i \neq j i=j s = 1 s = 1 s=1 s i i i j = 0 s_{iiij} = 0 siiij=0),则给定的方程等价于传统的余弦相似度公式。

该度量的时间复杂度是二次的,这使得它适用于实际任务。请注意,复杂度可以简化为亚二次。Gensim 开源库中包含了这种软余弦相似性的有效实现。

应用

余弦相似度在文本分析中特别有用。在文本处理中,文档或句子通常会被转换为向量(例如使用词频或TF-IDF值)。每个维度代表一个独特的词。通过计算这些文本向量的余弦相似度,我们可以量化文档间的相似性。

示例

假设有两个文本文档:

  • 文档1: “I like machine learning”
  • 文档2: “I love machine learning”

首先,将这些句子转换为向量。例如,基于词频,我们可能得到:

  • 向量1: [1, 1, 1, 0] (对应 “I”, “like”, “machine”, “learning”)
  • 向量2: [1, 0, 1, 1] (对应 “I”, “love”, “machine”, “learning”)

然后,我们可以计算这两个向量的余弦相似度。

扩展

除了在文本分析中的应用之外,余弦相似度还广泛应用于推荐系统(比如比较用户的喜好),以及在机器学习领域,如聚类分析和异常检测。

余弦相似度的主要优势之一在于它不受向量长度的影响,这在比较文本时尤其重要,因为文档长度可能会有很大差异。

GPT图像示例

为了更好地解释这个概念,我将生成一个图像,展示两个向量在二维空间中的表示,以及它们之间的夹角,来直观展示余弦相似度的概念。

在这里插入图片描述
上图展示了两个向量在二维空间中的表示,标记为向量A和向量B,以及它们之间的夹角。这个图像也包含了余弦相似度的公式,可以直观地帮助理解这个概念,非常适合用于技术博客中解释余弦相似度。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐