Milvus - 相似度量详解
在数据分析、分类和聚类任务中,相似度量是核心工具之一,衡量不同向量之间的相似性。选择适当的距离度量不仅提升分类与聚类的准确性,同时可以优化索引性能。Milvus 作为一款开源的向量数据库,支持多种相似度量和索引类型,适用于不同的数据类型(如浮点、二进制和稀疏嵌入)和应用场景。
相似度量与索引类型概览
Milvus 提供多种相似度量和索引类型组合,具体如下表所示:
嵌入类型 | 度量类型 | 索引类型 |
---|---|---|
浮点嵌入 | 欧氏距离 (L2)、内积 (IP)、余弦相似度 (COSINE) | IVF_FLAT、IVF_SQ8、IVF_PQ、GPU_IVF_FLAT、GPU_IVF_PQ、HNSW、DISKANN |
二进制嵌入 | 雅卡德、汉明距离 | BIN_FLAT、BIN_IVF_FLAT |
稀疏嵌入 | 内积 (IP) | SPARSE_WAND |
下面将详细介绍常用的几种距离度量方法及其适用场景。
1. 欧氏距离(L2)
欧氏距离用于测量两点间的直线距离,适用于数据连续的场景。欧氏距离的计算公式如下:
d L 2 ( a , b ) = ∑ i = 0 n − 1 ( a i − b i ) 2 d_{L2}(a, b) = \sqrt{\sum_{i=0}^{n-1} (a_i - b_i)^2} dL2(a,b)=i=0∑n−1(ai−bi)2
其中, a = ( a 0 , a 1 , … , a n − 1 ) a = (a_0, a_1, \dots, a_{n-1}) a=(a0,a1,…,an−1) 和 b = ( b 0 , b 1 , … , b n − 1 ) b = (b_0, b_1, \dots, b_{n-1}) b=(b0,b1,…,bn−1) 为 n 维欧氏空间中的两点。在 Milvus 中,当选择欧氏距离作为相似度度量时,系统只会计算平方和,以减少计算负担。
2. 内积(IP)
内积(Inner Product, IP)度量定义了两个嵌入之间的相似度,适合需要考虑幅度的场景。内积的计算公式如下:
IP ( X , Y ) = ∑ i = 0 n − 1 X i ⋅ Y i \text{IP}(X, Y) = \sum_{i=0}^{n-1} X_i \cdot Y_i IP(X,Y)=i=0∑n−1Xi⋅Yi
对于已归一化的数据,内积相当于余弦相似度。假设嵌入 X ′ X' X′ 是通过对嵌入 X X X 归一化得到的:
X ′ = X ∥ X ∥ X' = \frac{X}{\|X\|} X′=∥X∥X
则 (X’) 和 (Y’) 的内积相当于计算其余弦相似度。
3. 余弦相似度
余弦相似度衡量的是两向量之间的角度,适用于衡量方向一致性而不关心长度的场景。计算余弦相似度的公式如下:
cosine_similarity ( A , B ) = ∑ i = 0 n − 1 A i ⋅ B i ∑ i = 0 n − 1 A i 2 ⋅ ∑ i = 0 n − 1 B i 2 \text{cosine\_similarity}(A, B) = \frac{\sum_{i=0}^{n-1} A_i \cdot B_i}{\sqrt{\sum_{i=0}^{n-1} A_i^2} \cdot \sqrt{\sum_{i=0}^{n-1} B_i^2}} cosine_similarity(A,B)=∑i=0n−1Ai2⋅∑i=0n−1Bi2∑i=0n−1Ai⋅Bi
余弦相似度的取值范围为 [ − 1 , 1 ] [-1, 1] [−1,1],值越大,两个向量之间的夹角越小,相似度越高。
4. 雅卡德距离
雅卡德相似系数用于测量两个样本集的相似性,定义为交集的大小除以并集的大小。其公式为:
Jaccard ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) = \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)=∣A∪B∣∣A∩B∣
雅卡德距离则为 1 − Jaccard ( A , B ) 1 - \text{Jaccard}(A, B) 1−Jaccard(A,B),通常用于二进制数据或离散数据的比较。
5. 汉明距离
汉明距离用于衡量两个相同长度的二进制字符串之间的不同位数。其公式如下:
d Hamming ( X , Y ) = ∑ i = 0 n − 1 XOR ( X i , Y i ) d_{\text{Hamming}}(X, Y) = \sum_{i=0}^{n-1} \text{XOR}(X_i, Y_i) dHamming(X,Y)=i=0∑n−1XOR(Xi,Yi)
例如,字符串 “1101 1001” 和 “1001 1101” 的汉明距离为 2。
6. 结构相似性
在化学结构分析中,结构相似性用于判断一个化学结构是否是另一个结构的子结构或上层结构。假设有化学式的二进制表示 (A) 和数据库中的化学式 (B),判断公式如下:
- 上层结构判断:
superstructure ( A , B ) = { 1 , 若 A 是 B 的上层结构 0 , 否则 \text{superstructure}(A, B) = \begin{cases} 1, & \text{若 } A \text{ 是 } B \text{ 的上层结构} \\ 0, & \text{否则} \end{cases} superstructure(A,B)={1,0,若 A 是 B 的上层结构否则
- 子结构判断:
substructure ( A , B ) = { 1 , 若 A 是 B 的子结构 0 , 否则 \text{substructure}(A, B) = \begin{cases} 1, & \text{若 } A \text{ 是 } B \text{ 的子结构} \\ 0, & \text{否则} \end{cases} substructure(A,B)={1,0,若 A 是 B 的子结构否则
结语
在 Milvus 中选择合适的相似度量方式和索引类型,不仅能提升检索效率,还能更好地适应数据的多样性与实际应用场景。