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