1.面试问题 #
在向量数据库中,余弦相似度、欧几里得距离和曼哈顿距离是三种常见的向量搜索方法。请详细阐述它们各自的核心原理、计算方式、特点及典型适用场景,并比较它们之间的主要区别。
2. 参考答案 #
在向量数据库中,为了高效地进行相似性搜索,我们通常会使用不同的距离或相似度度量方法来量化向量之间的关系。其中,余弦相似度、欧几里得距离和曼哈顿距离是最为常见且重要的三种。
2.1 余弦相似度 (Cosine Similarity) #
2.1.1 核心原理与计算方式 #
余弦相似度衡量的是两个向量在多维空间中的方向一致性,即它们之间夹角的余弦值。它的计算不考虑向量的长度(模),只关注方向。
数学公式: $$\text{cos}(\theta) = \frac{A \cdot B}{||A|| \times ||B||} = \frac{\sum_{i=1}^{n} a_i \times b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \times \sqrt{\sum_{i=1}^{n} b_i^2}}$$
其中:
- $A \cdot B$ 是向量的点积
- $||A||$ 和 $||B||$ 分别是向量A和B的模长
- $\theta$ 是两个向量之间的夹角
1.2 特点 #
- 取值范围:
[-1, 1]- 值越接近
1表示方向越接近(越相似) 0表示正交(不相关)-1表示方向完全相反
- 值越接近
- 对向量长度不敏感:只关注相对方向,不受向量绝对大小影响
- 归一化友好:适合处理已归一化的向量
1.3 典型适用场景 #
- 文本和语义场景:判断两段文字是否表达相似的含义(如"猫"和"狗"的文本向量)
- 推荐系统:根据用户或物品的特征向量,推荐方向相似的物品
- 搜索引擎:基于查询和文档的语义相似性进行排序
- NLP应用:词向量、句子向量的相似性比较
2.2 欧几里得距离 (Euclidean Distance / 欧氏距离) #
2.2.1 核心原理与计算方式 #
欧几里得距离衡量的是多维空间中两点之间的直线距离。它计算的是对应维度差值的平方和的平方根。
数学公式: $$d = \sqrt{\sum_{i=1}^{n}(a_i - b_i)^2}$$
其中:
- $a_i$ 和 $b_i$ 分别是向量A和B在第i个维度的值
- $n$ 是向量的维度数
2.2 特点 #
- 取值范围:
[0, +∞) - 距离越小,表示向量越相似
- 对向量的绝对大小和方向都敏感
- 直观对应日常理解的"距离"概念
- 满足三角不等式:$d(A,C) \leq d(A,B) + d(B,C)$
2.3 典型适用场景 #
- 图像和视频检索:比较图像或视频的像素特征、颜色分布等空间差异
- 聚类分析:在K-means等聚类算法中衡量数据点之间的相似度
- 特征匹配:在计算机视觉中匹配图像特征点
- 数值型数据:处理连续数值特征时最直观的选择
2.3 曼哈顿距离 (Manhattan Distance) #
2.3.1 核心原理与计算方式 #
曼哈顿距离衡量的是多维空间中两点之间沿坐标轴方向的"城市街区"距离。它计算的是对应维度差值的绝对值之和。
数学公式: $$d = \sum_{i=1}^{n}|a_i - b_i|$$
其中:
- $|a_i - b_i|$ 是第i个维度差值的绝对值
- 其他符号含义与欧几里得距离相同
3.2 特点 #
- 取值范围:
[0, +∞) - 距离越小,表示向量越相似
- 对每个维度的差异进行线性累加,不涉及平方和开方
- 对异常值相对不敏感:不会因为某个维度的大差异而被过度放大
- 计算简单:只需要加法和绝对值运算
3.3 典型适用场景 #
- 网格状数据:城市地图上的路径规划(只能沿街道行走)
- 表格数据和稀疏数据处理:当维度之间存在独立性时
- 特征选择:在机器学习中衡量特征之间的差异
- 分类问题:在某些分类算法中作为距离度量
- 地理坐标:处理经纬度等地理数据
2.4 三种方法的几何直观对比 #
graph TD
A[向量A] --> B{选择度量方法}
B -->|余弦相似度| C[计算夹角余弦
方向优先] B -->|欧氏距离| D[计算直线距离
空间绝对差异] B -->|曼哈顿距离| E[计算网格路径距离
线性累加差异] C --> F[文本、语义场景] D --> G[图像、视频场景] E --> H[地理坐标、结构化数据] style C fill:#FFE4B5,stroke:#FF8C00,stroke-width:2px style D fill:#9370DB,stroke:#9370DB,stroke-width:2px,color:#fff style E fill:#90EE90,stroke:#90EE90,stroke-width:2px,color:#000
方向优先] B -->|欧氏距离| D[计算直线距离
空间绝对差异] B -->|曼哈顿距离| E[计算网格路径距离
线性累加差异] C --> F[文本、语义场景] D --> G[图像、视频场景] E --> H[地理坐标、结构化数据] style C fill:#FFE4B5,stroke:#FF8C00,stroke-width:2px style D fill:#9370DB,stroke:#9370DB,stroke-width:2px,color:#fff style E fill:#90EE90,stroke:#90EE90,stroke-width:2px,color:#000
2.5 核心区别对比表 #
| 特性/方法 | 余弦相似度 | 欧几里得距离 | 曼哈顿距离 |
|---|---|---|---|
| 衡量侧重 | 方向相似性 | 绝对空间距离 | 线性累加距离 |
| 是否关心长度 | 否 | 是 | 是 |
| 取值范围 | [-1, 1] |
[0, +∞) |
[0, +∞) |
| 计算复杂度 | 中等 | 中等 | 低 |
| 对异常值敏感性 | 低 | 高 | 中等 |
| 直观理解 | 向量夹角越小越相似 | 直线距离越短越相似 | 沿轴线路径越短越相似 |
| 典型应用 | 文本语义、推荐系统 | 图像视频检索、聚类 | 地理坐标、结构化数据 |
2.6 实际应用中的选择建议 #
2.6.1 根据数据类型选择 #
- 文本数据:优先选择余弦相似度,关注语义方向
- 图像数据:优先选择欧几里得距离,关注空间特征
- 地理数据:优先选择曼哈顿距离,符合实际移动逻辑
- 数值型数据:根据业务需求选择欧几里得或曼哈顿距离
2.6.2 根据业务需求选择 #
- 需要方向相似性:选择余弦相似度
- 需要绝对距离比较:选择欧几里得距离
- 需要线性累加差异:选择曼哈顿距离
- 计算资源受限:优先选择曼哈顿距离(计算最简单)
2.6.3 根据数据特征选择 #
- 高维稀疏数据:余弦相似度或曼哈顿距离
- 低维密集数据:欧几里得距离
- 存在异常值:曼哈顿距离(对异常值不敏感)
- 需要归一化:余弦相似度
2.7 性能优化考虑 #
2.7.1 计算效率 #
- 曼哈顿距离:计算最快,只需要加法和绝对值运算
- 欧几里得距离:需要平方和开方运算,相对较慢
- 余弦相似度:需要点积和模长计算,中等复杂度
2.7.2 内存使用 #
- 余弦相似度:通常需要存储归一化后的向量
- 欧几里得距离:可以直接使用原始向量
- 曼哈顿距离:可以直接使用原始向量
2.7.3 并行化支持 #
- 三种方法都支持向量化计算和并行处理
- 可以利用SIMD指令集和GPU加速
2.8 总结 #
简单记忆口诀:
- 余弦相似度:比"方向",适用于语义匹配
- 欧几里得距离:比"绝对距离",适用于空间特征比较
- 曼哈顿距离:比"线性累加距离",适用于网格路径或稀疏数据
在实际应用中,选择哪种度量方法需要综合考虑数据类型、业务需求、计算资源和性能要求。很多时候,我们会在不同的应用场景中组合使用这些方法,或者根据具体需求进行定制化的距离度量设计。