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保存的是什么