轉載自: https://blog.csdn.net/sparkexpert/article/details/68922307
對faiss進行基本的案例學習,具體步驟如下:
step1:構造實驗數據
step2:爲向量集構建IndexFlatL2索引,它是最簡單的索引類型,只執行強力L2距離搜索
step3:進行簡單的k-近鄰搜索
結果如下:
NOTE:
1.程序輸出爲查詢向量的最近鄰的4個向量的索引
step4:加快搜索速度
方法:
通過使用IndexIVFFlat索引,將數據集分割成多個,我們在d維空間中定義Voronoi單元,每個數據庫向量落在其中一個單元格中。在搜索時,只有查詢x所在的單元格中包含的數據庫向量y和幾個相鄰的數據庫向量y與查詢向量進行比較。
搜索方法有兩個參數:nlist(單元格數),nprobe(執行搜索訪問的單元格數(nlist以外))
對於nprobe = 1,結果如下:
結果和上面的強力搜索類似,但是不同(見上文)。這是因爲一些結果不在完全相同的Voronoi細胞。因此,訪問更多的單元格可能是有用的。
設置nprobe = 10,結果如下:
這是正確的結果。
但注意:在這種情況下獲得完美的結果只是數據分佈的一個假象,因爲它在x軸上有一個強大的組件,這使得它更容易處理。nprobe參數始終是調整速度和結果精度之間權衡的一種方式。設置nprobe = nlist給出與強力搜索相同的結果(但較慢)。
step5:進一步縮小存儲空間
我們看到的索引IndexFlatL2和IndexIVFFlat都存儲完整的向量。 爲了擴展到非常大的數據集,Faiss提供了基於產品量化器的有損壓縮來壓縮存儲的向量的變體。壓縮的方法基於乘積量化。
結果如下:
我們可以觀察到最近的鄰居被正確地找到(它是矢量ID本身),但是向量自身的估計距離不是0,儘管它遠遠低於與其他鄰居的距離。這是由於有損壓縮。
另外搜索真實查詢時,雖然結果大多是錯誤的,但是它們在正確的空間區域,而對於真實數據,情況更好,因爲:
1.統一數據很難進行索引,因爲沒有規律性可以被利用來聚集或降低維度
2. 對於自然數據,語義最近鄰居往往比不相關的結果更接近。