Milvus向量相似度计算方式对比

欧几里得距离 (L2)
测量两点之间的直线距离,就像用尺子测量两点间的距离一样。 距离越小,表示越相似
\[ L2(\vec{X},\vec{Y}) = \sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} \]
X Y A B 欧几里得距离
示例:
向量A = [1, 2, 3]
向量B = [4, 5, 6]
L2距离 = \(\sqrt{(1-4)^2 + (2-5)^2 + (3-6)^2} = \sqrt{9 + 9 + 9} = \sqrt{27} \approx 5.2\)
适用场景:
• 图像检索
• 人脸识别
• 当向量的大小(模长)有意义时
内积 (IP, Inner Product)
测量两个向量的方向相似度和大小的乘积。 值越大,表示越相似
\[ IP(\vec{X},\vec{Y}) = \sum_{i=1}^{n} x_i \cdot y_i \]
X Y 向量A 向量B 内积
示例:
向量A = [1, 2, 3]
向量B = [4, 5, 6]
内积 = \(1 \times 4 + 2 \times 5 + 3 \times 6 = 4 + 10 + 18 = 32\)
适用场景:
• 推荐系统
• 当向量已经归一化时
• 当需要考虑向量大小和方向时
余弦相似度 (Cosine)
测量两个向量之间的夹角,忽略向量的大小,只关注方向。 值越接近1,表示越相似
\[ \text{Cosine}(\vec{X},\vec{Y}) = \frac{\sum_{i=1}^{n} x_i \cdot y_i}{\sqrt{\sum_{i=1}^{n} x_i^2} \cdot \sqrt{\sum_{i=1}^{n} y_i^2}} = \frac{\vec{X} \cdot \vec{Y}}{||\vec{X}|| \cdot ||\vec{Y}||} \]
X Y 向量A 向量B θ cos(θ) = 向量A·向量B / (|A|·|B|)
示例:
向量A = [1, 2, 3]
向量B = [4, 5, 6]
\(||\vec{A}|| = \sqrt{1^2 + 2^2 + 3^2} = \sqrt{14} \approx 3.74\)
\(||\vec{B}|| = \sqrt{4^2 + 5^2 + 6^2} = \sqrt{77} \approx 8.77\)
余弦相似度 = \(\frac{1 \times 4 + 2 \times 5 + 3 \times 6}{3.74 \times 8.77} = \frac{32}{32.8} \approx 0.975\)
适用场景:
• 文本相似度比较
• 当只关心方向而不关心大小时
• 自然语言处理
汉明距离 (Hamming)
计算两个等长字符串或二进制串对应位置不同的数量。 距离越小,表示越相似
\[ \text{Hamming}(\vec{X},\vec{Y}) = \sum_{i=1}^{n} [x_i \neq y_i] \]
向量A: 1 0 1 0 1 向量B: 1 1 0 0 0 汉明距离 = 3(第2、3、5位不同)
示例:
向量A = [1, 0, 1, 0, 1]
向量B = [1, 1, 0, 0, 0]
汉明距离 = 3(第2、3、5位不同)
适用场景:
• 错误检测和纠正
• 生物信息学
• 二进制特征比较
• 图像哈希比较

对比表格

度量类型 相似度表示 值范围 适用数据类型 计算复杂度
欧几里得距离 (L2) 距离越小越相似 [0, +∞) 连续数值向量 中等
内积 (IP) 值越大越相似 (-∞, +∞) 连续数值向量
余弦相似度 (Cosine) 值越接近1越相似 [-1, 1] 连续数值向量 中等
汉明距离 (Hamming) 距离越小越相似 [0, 向量维度] 二进制向量

如何选择合适的度量类型?