[笔记]-什么是相似性搜索?

相似性搜索是指在数据集中寻找与给定查询项最相似的项的过程。它广泛应用于:

  • 推荐系统(例如,推荐相似的电影)
  • 图像和视频检索
  • 自然语言处理(例如,寻找相似的文档或句子)
  • 生物识别(例如,人脸识别)

相似性搜索的核心是一个距离或相似性度量,用于量化两个数据点的相似程度。度量的选择取决于数据的性质和应用。

有用的数学知识

不知道大家有没有过这种数学 "真香反转" 的体验?

我上学那会儿总觉得,数学也就专业课里能凑个用场,属于 "考完就丢" 的阶段性工具;等上班了,更是感觉完全用不上,当年学的那些定理公式,早不知道忘到哪个犄角旮旯去了。

结果入坑 AI 后直接被打脸 ------ 合着 AI 里里外外全是数学啊!原来之前不是数学没用,是我没走到用得上的地界儿。

扯远了,在此我们就聊几个基础的数学概念,搞懂不同的距离度量到底是怎么回事。不用背公式,就是理解几种度量的区别、以及背后的原因。

角的余弦是什么?

回想一下,角的余弦定义为邻边长度与斜边长度的比率:

cos(α)=adjacenthypotenusecos(\alpha) = \frac{adjacent}{hypotenuse}cos(α)=hypotenuseadjacent

在图示中,可以表示如下:

其中邻边的长度是∣∣c∣∣||c||∣∣c∣∣,斜边的长度是∣∣a∣∣||a||∣∣a∣∣。我们选择∣∣c∣∣||c||∣∣c∣∣和∣∣a∣∣||a||∣∣a∣∣来表示这个直角三角形的边长的原因将在后面显现。

对于上述三角形,角α\alphaα的余弦由以下公式给出:cos(α)=∣∣c∣∣∣∣a∣∣cos(\alpha) = \frac{||c||}{||a||}cos(α)=∣∣a∣∣∣∣c∣∣。

当然,可以重新排列上述公式以求解邻边的长度∣∣c∣∣||c||∣∣c∣∣,以便用斜边的长度∣∣a∣∣||a||∣∣a∣∣和角α\alphaα的余弦来表示:∣∣c∣∣=∣∣a∣∣cos(α)||c|| = ||a||cos(\alpha)∣∣c∣∣=∣∣a∣∣cos(α)。将∣∣c∣∣||c||∣∣c∣∣替换为∣∣a∣∣cos(α)||a||cos(\alpha)∣∣a∣∣cos(α)会导致以下图示:

什么是向量?

向量是一个具有长度和方向的几何对象。它可以在与向量的分量数量相同维数的笛卡尔平面上表示。例如,具有两个分量的向量可以在二维笛卡尔平面上用从原点开始的线表示,而具有三个分量的向量可以在三维笛卡尔平面上用从原点开始的线表示。

考虑向量a=4,8a = 4,8a=4,8。这个向量有两个分量,因此可以在二维笛卡尔平面上用下图表示:

重要的是要记住,aaa是一个_向量_,而不是_长度_或大小。为了清晰起见,以下图清楚地指示了向量分量:

向量aaa的大小可以使用L2范数计算,也称为欧几里得范数:∣∣a∣∣=∑k=1nak2||a|| = \sqrt{\sum_{k=1}^n a_k^2}∣∣a∣∣=∑k=1nak2 ,其中aka_kak表示向量aaa的第k个分量,nnn表示分量的总数。对于只有两个分量的向量xxx和yyy,向量的大小由毕达哥拉斯定理给出:∣∣a∣∣=x2+y2||a|| = \sqrt{x^2 + y^2}∣∣a∣∣=x2+y2 。例如,对于向量a=4,8a = 4,8a=4,8,大小为∣∣a∣∣=42+82≈8.94||a|| = \sqrt{4^2 + 8^2} \approx 8.94∣∣a∣∣=42+82 ≈8.94:

当向量用作嵌入时,向量的方向通常编码语义含义或主题,而向量的大小(或长度)有时可以反映该意义的强度、信心或显著性------例如,某个产品的受欢迎程度或某个来源的权威性。

多个向量

多个向量可以在同一个笛卡尔平面上绘制。下面的图显示了二维平面上的两个向量:向量a=4,8a = 4,8a=4,8和向量b=11.5,5b = 11.5, 5b=11.5,5

距离函数的目的是提供一个数字,表示这些向量之间的距离,数值越大表示向量之间的距离越远。相反,相似度函数的目的是提供一个数字,反映这些向量的相似程度,数值越大表示向量越相似。在许多情况下,相似度度量可以通过一个非常简单的公式转换为距离度量(反之亦然)。让我们分析一些更常见的距离和相似度度量。

常见距离和相似性度量

1. L2 距离(欧几里得距离)

定义

两个向量aaa和bbb之间的L2距离是对应元素之间平方差的和的平方根:

L2(a,b)= ∑i=1n(ai−bi)2\text{L2}(a,b) = \ \sqrt{\sum_{i=1}^n (a_i - b_i)^2}L2(a,b)= ∑i=1n(ai−bi)2

示例 1

让我们看看如何计算向量a=4,8a = 4,8a=4,8和向量b=11.5,5b = 11.5, 5b=11.5,5之间的L2距离:

L2(a,b)= ∑i=1n(ai−bi)2\text{L2}(a,b) = \ \sqrt{\sum_{i=1}^n (a_i - b_i)^2}L2(a,b)= ∑i=1n(ai−bi)2

L2(a,b)= (a1−b1)2+(a2−b2)2\text{L2}(a,b) = \ \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2}L2(a,b)= (a1−b1)2+(a2−b2)2

L2(a,b)= (4−11.5)2+(8−5)2\text{L2}(a,b) = \ \sqrt{(4 - 11.5)^2 + (8 - 5)^2}L2(a,b)= (4−11.5)2+(8−5)2

L2(a,b)≈8.08\text{L2}(a,b) \approx 8.08L2(a,b)≈8.08

示例 2

对于更高维度,我们可以类似地进行计算。例如,要计算向量q=1,2,3q = 1, 2, 3q=1,2,3和r=4,5,6r = 4, 5, 6r=4,5,6之间的L2距离:

L2(q,r)= ∑i=1n(qi−ri)2\text{L2}(q,r) = \ \sqrt{\sum_{i=1}^n (q_i - r_i)^2}L2(q,r)= ∑i=1n(qi−ri)2

L2(q,r)= (q1−r1)2+(q2−r2)2+(q3−r3)2\text{L2}(q,r) = \ \sqrt{(q_1 - r_1)^2 + (q_2 - r_2)^2 + (q_3 - r_3)^2}L2(q,r)= (q1−r1)2+(q2−r2)2+(q3−r3)2

L2(q,r)= (1−4)2+(2−5)2+(3−6)2\text{L2}(q,r) = \ \sqrt{(1 - 4)^2 + (2 - 5)^2 + (3 - 6)^2}L2(q,r)= (1−4)2+(2−5)2+(3−6)2

L2(q,r)= ≈5.20\text{L2}(q,r) = \ \approx 5.20L2(q,r)= ≈5.20

图示

在图示上,L2距离可以表示为在笛卡尔平面中表示向量的箭头尖端之间的直线距离:

属性

  • L2 距离测量的是欧几里得空间中两点之间的直线距离,遵循毕达哥拉斯定理的原则。
  • 它对向量的大小和方向都很敏感,这意味着任一方面的变化都可能显著影响计算出的距离。
  • 这种距离度量常用于涉及空间或几何数据的应用,如图像分析、计算机视觉和地理制图。

用例

  • L2 距离的一个常见用例是在二维 (2D) 或三维 (3D) 空间中确定离给定位置最近的点。这种方法在计算机视觉任务中经常使用,其中特征或对象之间的空间接近性起着关键作用。

2. 点积(内积)相似性和距离

定义

两个向量的点积为:

a⋅b=∑i=1naibia \cdot b = \sum_{i=1}^{n} a_i b_ia⋅b=∑i=1naibi

示例 1

让我们看看如何计算向量a=4,8a = 4,8a=4,8和向量b=11.5,5b = 11.5, 5b=11.5,5之间的点积:

a⋅b=∑i=1naibia \cdot b = \sum_{i=1}^{n} a_i b_ia⋅b=∑i=1naibi

a⋅b= a1b1+a2b2a \cdot b = \ a_1 b_1 + a_2 b_2a⋅b= a1b1+a2b2

a⋅b= 4×11.5+8×5a \cdot b = \ 4 \times 11.5 + 8 \times 5a⋅b= 4×11.5+8×5

a⋅b=86a \cdot b = 86a⋅b=86

示例 2

对于更高维度,我们可以类似地进行计算。例如,要计算向量q=1,2,3q = 1, 2, 3q=1,2,3和r=4,5,6r = 4, 5, 6r=4,5,6之间的点积:

q⋅r=∑i=1nqiriq \cdot r = \sum_{i=1}^{n} q_i r_iq⋅r=∑i=1nqiri

q⋅r= q1r1+q2r2+q3r3q \cdot r = \ q_1 r_1 + q_2 r_2 + q_3 r_3q⋅r= q1r1+q2r2+q3r3

q⋅r= 1×4+2×5+3×6q \cdot r = \ 1 \times 4 + 2 \times 5 + 3 \times 6q⋅r= 1×4+2×5+3×6

q⋅r= 32q \cdot r = \ 32q⋅r= 32

注意:点积是一种相似性度量:点积越大,向量之间的相似性越高。为了将点积转换为距离,需要计算点积的负值:点积的负值越大,两个向量之间的距离越大。

替代计算

我们希望仅使用向量的大小来计算点积。理想情况下,这将涉及简单地将大小相乘。然而,由于向量可能指向不同的方向,我们必须考虑它们之间的角度。为此,我们可以将一个向量投影到另一个向量的方向上,然后再进行乘法运算。考虑以下图示,将向量a=4,8a = 4,8a=4,8投影到向量b=11.5,5b = 11.5, 5b=11.5,5上:

在上面的图中,向量aaa投影到向量bbb上,结果是一个指向与bbb相同方向的向量,该向量由覆盖在bbb部分上的橙色弦表示。我们将这个投影向量的长度定义为∣∣c∣∣||c||∣∣c∣∣:

实际上,我们可以通过将向量bbb的长度(∣∣b∣∣||b||∣∣b∣∣)与aaa在bbb上的投影长度(∣∣c∣∣||c||∣∣c∣∣)相乘来计算点积a⋅ba \cdot ba⋅b:

a⋅b=∣∣b∣∣ ∣∣c∣∣a \cdot b = ||b|| \ ||c||a⋅b=∣∣b∣∣ ∣∣c∣∣

现在,让α\alphaα表示向量aaa和bbb之间的角度,如上图所示。注意,aaa在bbb上的投影形成一个直角三角形,其中长度∣∣c∣∣||c||∣∣c∣∣为角α\alphaα的邻边,而长度∣∣a∣∣||a||∣∣a∣∣为斜边。这使我们可以使用以下公式计算角的余弦:

cos(α)=adjacenthypotenusecos(\alpha) = \frac{adjacent}{hypotenuse}cos(α)=hypotenuseadjacent

cos(α)=∣∣c∣∣∣∣a∣∣cos(\alpha) = \frac{||c||}{||a||}cos(α)=∣∣a∣∣∣∣c∣∣

重新排列上述公式,我们可以求解∣∣c∣∣||c||∣∣c∣∣:

∣∣c∣∣=∣∣a∣∣cos(α)||c|| = ||a|| cos(\alpha)∣∣c∣∣=∣∣a∣∣cos(α)

最后,将∣∣c∣∣||c||∣∣c∣∣替换为∣∣a∣∣cos(α)||a|| cos(\alpha)∣∣a∣∣cos(α)以计算点积:

a⋅b=∣∣b∣∣ ∣∣c∣∣a \cdot b = ||b|| \ ||c||a⋅b=∣∣b∣∣ ∣∣c∣∣

a⋅b=∣∣b∣∣ ∣∣a∣∣cos(α)a \cdot b = ||b|| \ ||a|| cos(\alpha)a⋅b=∣∣b∣∣ ∣∣a∣∣cos(α)

a⋅b=∣∣a∣∣ ∣∣b∣∣cos(α)a \cdot b = ||a|| \ ||b|| cos(\alpha)a⋅b=∣∣a∣∣ ∣∣b∣∣cos(α)

换句话说,点积a⋅ba \cdot ba⋅b可以通过将aaa的长度与bbb的长度及其之间的角度α\alphaα的余弦相乘来计算。直观上,点积是两个向量长度的乘积,其中一个向量已根据角度的余弦投影到另一个向量上,以考虑到向量指向不同方向的事实。这个概念可以通过以下图示部分展示:

在上面的图中,aaa在bbb上的投影长度表示为∣∣a∣∣cos(α)||a||cos(\alpha)∣∣a∣∣cos(α),而向量bbb的长度表示为∣∣b∣∣||b||∣∣b∣∣。点积a⋅ba \cdot ba⋅b就是长度∣∣b∣∣||b||∣∣b∣∣和∣∣a∣∣cos(α)||a|| cos(\alpha)∣∣a∣∣cos(α)的乘积,或者在重新排列后为∣∣a∣∣ ∣∣b∣∣cos(α)||a|| \ ||b|| cos(\alpha)∣∣a∣∣ ∣∣b∣∣cos(α)。

替代计算示例

让我们看看如何计算向量a=4,8a = 4,8a=4,8、向量b=11.5,5b = 11.5, 5b=11.5,5和角度α=39.94∘\alpha = 39.94^{\circ}α=39.94∘之间的点积:

∣∣a∣∣=∑k=1nak2||a|| = \sqrt{\sum_{k=1}^n a_k^2}∣∣a∣∣=∑k=1nak2

∣∣a∣∣=42+82||a|| = \sqrt{4^2 + 8^2}∣∣a∣∣=42+82

∣∣a∣∣≈8.94||a|| \approx 8.94∣∣a∣∣≈8.94

∣∣b∣∣=∑k=1nbk2||b|| = \sqrt{\sum_{k=1}^n b_k^2}∣∣b∣∣=∑k=1nbk2

∣∣b∣∣=11.52+52||b|| = \sqrt{11.5^2 + 5^2}∣∣b∣∣=11.52+52

∣∣b∣∣≈12.54||b|| \approx 12.54∣∣b∣∣≈12.54

cos(39.94)≈0.767cos(39.94) \approx 0.767cos(39.94)≈0.767

a⋅b=∣∣a∣∣ ∣∣b∣∣cos(α)a \cdot b = ||a|| \ ||b|| cos(\alpha)a⋅b=∣∣a∣∣ ∣∣b∣∣cos(α)

a⋅b≈8.94×12.54×0.767a \cdot b \approx 8.94 \times 12.54 \times 0.767a⋅b≈8.94×12.54×0.767

a⋅b≈85.99a \cdot b \approx 85.99a⋅b≈85.99

经过四舍五入后,结果与之前使用公式a⋅b=∑i=1naibia \cdot b = \sum_{i=1}^{n} a_i b_ia⋅b=∑i=1naibi计算的长度86相等。

属性

  • 两个向量的点积可以是正数、负数或零,这取决于它们之间的角度。
  • 较大的点积值通常表示向量之间的相似度更高,特别是当它们指向相似方向时。
    • 如果需要距离类度量 ,可以使用点积的负值。在这种情况下,较大的(更负的)值对应于更大的不相似性或距离。
  • 点积对向量的大小和方向都很敏感,这意味着任一方面的变化都会影响结果。
  • 它在机器学习模型中被广泛使用,例如在神经网络中计算激活值或在矩阵分解中用于推荐系统。

用例:当向量的长度(代表某种相关性、信心或数量)具有意义时。例如,在推荐系统中,向量的方向通常表示两个产品关于相同主题,但较大的大小可能表示某个产品更受欢迎。在这种情况下,使用点积相似性是合理的,因为人们希望推荐不仅关于相同主题的产品,还要是受欢迎的产品。

3. 余弦相似度和距离

定义

余弦相似度衡量两个向量之间角度的余弦值:

cosine_similarity(a,b)=a⋅b∣∣a∣∣ ∣∣b∣∣\text{cosine\textunderscore similarity}(a, b) = \frac{a \cdot b}{||a|| \ ||b||}cosine_similarity(a,b)=∣∣a∣∣ ∣∣b∣∣a⋅b

注意 :余弦相似度是一种相似度度量:余弦相似度越大,向量越相似。为了将余弦相似度转换为余弦距离,可以使用一减去余弦相似度:

cosine_distance(a,b)=1−cosine_similarity(a,b)\text{cosine\textunderscore distance}(a, b) = 1 - \text{cosine\textunderscore similarity}(a, b)cosine_distance(a,b)=1−cosine_similarity(a,b)。余弦距离越大,向量越不相似。

替代计算

如果向量已归一化,余弦相似度可以更高效地计算。为了归一化一个向量,将其除以其 L2 范数:

norm(a)=a∣∣a∣∣norm(a) = \frac{a}{||a||}norm(a)=∣∣a∣∣a

例如,对于向量a=4,8a = 4,8a=4,8,归一化向量的计算如下:

∣∣a∣∣=∑k=1nak2||a|| = \sqrt{\sum_{k=1}^n a_k^2}∣∣a∣∣=∑k=1nak2

∣∣a∣∣=42+82||a|| = \sqrt{4^2 + 8^2}∣∣a∣∣=42+82

∣∣a∣∣≈8.94||a|| \approx 8.94∣∣a∣∣≈8.94

norm(a)=a∣∣a∣∣norm(a) = \frac{a}{||a||}norm(a)=∣∣a∣∣a

norm(a)≈4,88.94norm(a) \approx \frac{4,8}{8.94}norm(a)≈8.944,8

norm(a)≈48.94,88.94norm(a) \approx \big\\frac{4}{8.94}, \\frac{8}{8.94}\\bignorm(a)≈8.944,8.948

norm(a)≈0.448,0.895norm(a) \approx 0.448, 0.895norm(a)≈0.448,0.895

归一化向量具有一个特性,即平方分量的总和为一:

∑i=1nnorm(a)i2=1\sum_{i=1}^n norm(a)_i^2 = 1∑i=1nnorm(a)i2=1

例如,对于归一化向量norm(a)=0.448,0.895norm(a) = 0.448, 0.895norm(a)=0.448,0.895

∑i=1nnorm(a)i2=0.4482+0.8952≈1\sum_{i=1}^n norm(a)_i^2 = 0.448^2 + 0.895^2 \approx 1∑i=1nnorm(a)i2=0.4482+0.8952≈1

计算两个归一化向量之间的余弦相似度就像计算它们的点积一样简单:

cosine_similarity(a,b)=a⋅b∣∣a∣∣ ∣∣b∣∣\text{cosine\textunderscore similarity}(a, b) = \frac{a \cdot b}{||a|| \ ||b||}cosine_similarity(a,b)=∣∣a∣∣ ∣∣b∣∣a⋅b

cosine_similarity(a,b)=a∣∣a∣∣⋅b∣∣b∣∣\text{cosine\textunderscore similarity}(a, b) = \frac{a}{||a||} \cdot \frac{b}{||b||}cosine_similarity(a,b)=∣∣a∣∣a⋅∣∣b∣∣b

cosine_similarity(a,b)=norm(a)⋅norm(b)\text{cosine\textunderscore similarity}(a, b) = norm(a) \cdot norm(b)cosine_similarity(a,b)=norm(a)⋅norm(b)

请注意,许多嵌入模型默认归一化向量,因为这使得可以使用点积高效地计算余弦相似度或距离。由于基于余弦的比较很常见,而点积计算更快,因此在仅需要基于余弦的比较时,存储归一化向量是一个实用的选择。

属性

  • 余弦相似度关注向量的方向而不是它们的大小,测量它们之间角度的余弦值。
  • 它特别适合高维、稀疏数据,如文本嵌入或自然语言处理中的词频向量。
  • 该度量对向量长度不变,意味着缩放向量的大小不会影响相似度得分。

用例

  • 余弦相似度的一个常见用例是在自然语言处理(NLP)中测量文档相似性,它有助于识别内容相似的文本,无论它们的长度如何。

选择合适的指标

指标 对大小敏感 归一化 最适合
L2 距离 ✅ 是 ❌ 否 空间数据,聚类
余弦距离 ❌ 否 ✅ 是 文本,嵌入,NLP
点积 ✅ 是 ❌ 否 神经网络,推荐系统

实际考虑

  • 归一化
    • 如果您只需计算余弦相似度,请对向量进行归一化。对于许多自然语言处理任务和文本嵌入模型,这是默认选项。
  • 高维数据
    • L2 距离可能会受到"维度诅咒"的影响。如果数据表现出高维特征,请考虑使用不同的度量或使用降维技术。
    • 在高维情况下,余弦距离通常表现更好,并且是许多自然语言处理和基于文本任务的默认选择。
    • 点积可以通过矩阵运算高效计算,如果向量经过归一化,可以用于计算余弦相似度。

结论

选择合适的距离度量对于有效的相似性搜索至关重要。理解这些权衡有助于为您的特定用例选择最合适的度量。

L2 距离适用于连续的、低维数据,其中大小很重要。

余弦距离在高维稀疏数据中表现出色,在这种情况下,方向比大小更为重要。

点积提供了计算效率,当大小和方向都对相似性有贡献时非常有用。

相关推荐
阿童木写作20 分钟前
跨境电商图片翻译工具,批量翻译视频字幕还免费
python·音视频
sukioe21 分钟前
城智连响:基于 LangGraph 与四库分层架构的城市公共设施智能报修与派单系统
人工智能·python·ai·架构·langchain
卷无止境1 小时前
Coding Agent 里的上下文 Compact,到底在压缩什么
后端·python
CoderJia程序员甲1 小时前
GitHub 热榜项目 - 周榜(2026-08-30)
ai·大模型·llm·github·ai教程
Patrick在香港1 小时前
Claude Prompt Caching 实测账单:第一轮贵 25%,从第二轮开始省 86%
python·prompt·claude·成本优化·prompt缓存·anthropic api
新时代牛马1 小时前
字符设备注册:从cdev_add 到chrdev_open 的 VFS路径
python
life1691 小时前
python requests采集同花顺F10、龙虎榜数据
python·同花顺·龙虎榜
angushine1 小时前
qwen3-tts使用实例
python·tts
tachibana22 小时前
Agent 的长短期记忆系统
人工智能·ai·大模型·llm·agent