ann-benchmarks中recall计算方法解读

Faiss的ivfPQfs索引方法的recall有两种:

  • 一种是Faiss提供的R@k,指的是搜索得到k个点,包含groundtruth中top-1的queries占查询个数的比例
  • 另一种是我们通常使用的recall,recall@k指搜索得到的k个点中与groundtruth的前k个点重合的比例

但是我在运行faiss的时候却发现,在使用同一组参数的情况下,recall@10无法达到ann-benchmark中显示的召回率:(不知道大家有没有遇到和我一样的问题)

运行结果:

recall = 0.61078
R@1 = 0.5099
R@10 = 0.9327
R@100 = 0.9873

 

recall = 0.61097
R@1 = 0.5104
R@10 = 0.9325
R@100 = 0.9325

然而在ann-benchmarks中运行结果为0.97

 

于是我怀疑ann-benchmark使用的是第二种,下面仔细分析ann-benchmark的recall计算方法

图像中对应的参数为:

主要关注"k-nn",在度量方法中,“k-nn”调用了knn函数,该函数输入参数true_distances、run_distances、run_attrs["count"]、metrics,返回一个具有attrs属性的对象,包含一个名为"mean"的键:

下面去观察knn函数,这个函数在metrics中创建了一个名为"knn"的group,并且用knn_metrics对其进行操作,调用了get_recall_values计算recall的平均值、标准差和recall值:

下面去看在哪里调用的knn函数,以及data_distance和run_distance保存的是什么

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章