大规模向量相似度计算(二)——hnswlib的参数含义

在此之前写了一篇hnswlib在大规模向量近邻检索上的使用,本篇展开来讲一下hnswlib不同参数的含义。
相关系列文章可参考:
《大规模向量相似度计算(一)——hnswlib的基本使用示例》
《大规模向量相似度计算(二)——hnswlib的参数含义》
《HNSW的基本原理及使用》

1. hnswlib支持的距离

在 hnswlib分别支持L2距离,向量内积以及cosine相似度。在构建索引的过程中对应的具体参数为:
l2,ip,cosine

Distanceparameterequation
Squared L2‘l2’ d = ∑ i = 0 N ( A i − B i ) 2 d = \sum_{i=0}^{N}(A_i-B_i)^2 d=i=0N(AiBi)2
Inner product‘ip’ d = 1.0 − ∑ i = 0 N ( A i × B i ) d = 1.0 - \sum_{i=0}^{N}(A_i \times B_i) d=1.0i=0N(Ai×Bi)
Cosine similarity‘cosine’ d = 1.0 − ∑ i = 0 N ( A i ∗ B i ) 2 ∑ i = 0 N ( A i ∗ A i ) × ∑ i = 0 N ( B i ∗ B i ) d = 1.0 - \frac{\sum_{i=0}^N(A_i * B_i)^2}{\sum_{i=0}^N(A_i * A_i) \times \sum_{i=0}^N(B_i * B_i)} d=1.0i=0N(AiAi)×i=0N(BiBi)i=0N(AiBi)2

构建索引的时候,通过传递参数确认检索最近邻需要使用的距离:

p = hnswlib.Index(space = 'l2', dim = dim)

2 构建参数

在索引初始化阶段的代码如下:

index.init_index(max_elements=num_elements, ef_construction=200, M=16)

M: 表示在构建期间,每个元素创建的双向链表的数量。M合理的范围是2-100。M值较高的时候在高召回率数据集上效果好,M值较低在低召回率数据集上效果好。M值决定了算法内存消耗,大概是 M × ( 8   10 )    B y t e s M \times (8~10)\;Bytes M×(8 10)Bytes

ef_construction:控制了索引时间和索引准确度,和ef参数具有相同的意义。ef_constraction越大,构建时间越长,但是索引质量更好。在某种程度上提高ef_construction并不能提高index的质量。

  • 检查ef_construction的选取是否正确的一种方法是在ef=ef_construction的时候测量M最近邻搜索的召回率,如果召回率低于0.9,ef_construction可以继续改进。

num_elements: 在index最大的元素个数。

3 检索参数

在近邻检索阶段的代码如下:

index.set_ef(int(k * 1.2))
labels, distances = index.knn_query(data, k=k)

ef: 动态检索链表的大小。当ef设置的越大,越准确同时检索速度越慢,ef不能设置的比检索最近邻的个数K小。ef的值可以设置为k到集合大小之间的任意值。

k: 结果中返回的最近邻的结果的个数k。knn_query函数返回两个numpy数据。分别包括k个最近邻结果的标签和与这k个标签的距离。

hnswlib 完整代码

搜索并关注微信公众号:【charlie_mouse】
回复:hnswlib 获取测试代码

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Java中可以使用向量相似度计算来衡量两个向量之间的相似程度。常用的向量相似度计算方法有余弦相似度和欧氏距离。 1. 余弦相似度(Cosine Similarity):余弦相似度是通过计算两个向量的夹角来衡量它们之间的相似程度。具体计算公式如下: ![cosine_similarity](https://img-blog.csdnimg.cn/20210709103605134.png) 其中,A和B分别表示两个向量,|A|和|B|分别表示两个向量的模,A·B表示两个向量的点积。 2. 欧氏距离(Euclidean Distance):欧氏距离是通过计算两个向量之间的距离来衡量它们之间的相似程度。具体计算公式如下: ![euclidean_distance](https://img-blog.csdnimg.cn/20210709103605135.png) 其中,A和B分别表示两个向量,n表示向量的维度。 在Java中,可以使用Apache Commons Math库来进行向量相似度计算。以下是使用Apache Commons Math库计算余弦相似度和欧氏距离的示例代码: ```java import org.apache.commons.math3.linear.ArrayRealVector; import org.apache.commons.math3.linear.RealVector; import org.apache.commons.math3.linear.VectorUtil; public class VectorSimilarity { public static void main(String[] args) { double[] vectorA = {1, 2, 3}; double[] vectorB = {4, 5, 6}; RealVector a = new ArrayRealVector(vectorA); RealVector b = new ArrayRealVector(vectorB); // 计算余弦相似度 double cosineSimilarity = VectorUtil.cosineDistance(a, b); System.out.println("Cosine Similarity: " + cosineSimilarity); // 计算欧氏距离 double euclideanDistance = a.getDistance(b); System.out.println("Euclidean Distance: " + euclideanDistance); } } ``` 注意:在使用示例代码之前,需要先引入Apache Commons Math库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值