相似度量
在 Milvus 中,相似度量用于衡量向量之间的相似性。选择一个好的距离度量有助于显著提高分类和聚类性能。
下表显示了这些广泛使用的相似度量如何与各种输入数据形式和 Milvus 索引相匹配。目前,Milvus 支持各种类型的数据,包括浮点嵌入(通常称为浮点向量或密集向量)、二进制嵌入(也称为二进制向量)和稀疏嵌入(也称为稀疏向量)。
度量类型 | 索引类型 |
---|---|
|
|
度量类型 | 索引类型 |
---|---|
|
|
度量类型 | 索引类型 |
---|---|
IP |
|
欧氏距离(L2)
从本质上讲,欧氏距离测量的是连接两点的线段的长度。
欧氏距离的计算公式如下:
欧几里得
其中a= (a0,a1,...,an-1) 和b= (b0,b0,...,bn-1) 是 n 维欧几里得空间中的两点。
这是最常用的距离度量,在数据连续时非常有用。
内积(IP)
两个向量 Embeddings 之间的 IP 距离定义如下:
IP
如果需要比较非标准化数据,或者需要考虑幅度和角度,IP 会更有用。
如果将 IP 距离度量应用于归一化嵌入,结果将等同于计算嵌入之间的余弦相似度。
假设 X' 是由嵌入 X 归一化而来:
归一化
两个嵌入式之间的相关性如下:
归一化
余弦相似性
余弦相似度使用两组向量之间角度的余弦来衡量它们的相似程度。你可以把两组向量看成是从同一个原点([0,0,...])出发但指向不同方向的两条线段。
要计算两组向量A = (a0,a1,...,an-1)和B = (b0,b1,...,bn-1) 之间的余弦相似度,请使用下面的公式:
余弦相似度
余弦相似度始终位于区间[-1, 1]。例如,两个正比向量的余弦相似度为1,两个正交向量的余弦相似度为0,两个相反向量的余弦相似度为-1。余弦越大,两个向量之间的夹角越小,说明这两个向量之间的相似度越高。
用 1 减去它们的余弦相似度,就可以得到两个向量之间的余弦距离。
雅卡德距离
Jaccard 相似性系数衡量两个样本集之间的相似性,其定义为定义集的交集的卡方除以它们的联合的卡方。它只能应用于有限样本集。
杰卡德相似系数
雅卡距离测量数据集之间的不相似性,通过从 1 减去雅卡相似系数得出。对于二元变量,雅卡距离等同于塔尼莫托系数。
雅卡距离
汉明距离
汉明距离测量二进制数据字符串。两个长度相等的字符串之间的距离是比特不同的比特位置数。
例如,假设有两个字符串:1101 1001 和 1001 1101。
11011001 ⊕ 10011101 = 01000100.由于其中包含两个 1,所以汉明距离 d (11011001, 10011101) = 2。
结构相似性
当一种化学结构作为更大化学结构的一部分出现时,前者称为子结构,后者称为上结构。例如,乙醇是乙酸的子结构,乙酸是乙醇的上结构。
结构相似性是用来判断两个化学式是否相似,即一个化学式是另一个化学式的上结构或下结构。
要确定 A 是否是 B 的上结构,请使用下式:
上层建筑
其中
- A 是要检索的化学式的二进制表示形式
- B 是数据库中化学式的二进制表示形式
一旦返回0
,A就不是B 的上层结构。否则,结果正好相反。
要确定 A 是否是 B 的子结构,请使用下面的公式:
子结构
其中
- A 是要检索的化学式的二进制表示形式
- B 是数据库中化学式的二进制表示形式
一旦返回0
,则A不是B 的子结构。否则,结果正好相反。
常见问题
度量类型是内积,为什么向量搜索的 top1 结果不是搜索向量本身?
如果使用内积作为距离度量时没有对向量进行归一化处理,就会出现这种情况。什么是归一化?为什么需要归一化?
归一化指的是转换嵌入(向量)使其法向量等于 1 的过程。如果使用内积计算嵌入式相似度,就必须对嵌入式进行归一化处理。归一化后,内积等于余弦相似度。
更多信息,请参阅维基百科。
为什么使用欧氏距离 (L2) 和内积 (IP) 作为距离度量会得到不同的结果?
检查向量是否归一化。如果没有,则需要先对向量进行归一化处理。从理论上讲,如果向量没有归一化,用 L2 计算出的相似度与用 IP 计算出的相似度是不同的。下一步
- 进一步了解 Milvus 支持的索引类型。