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

 

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