faiss python安装_faiss入门
Faiss入門篇假定Faiss已經被安裝,若未安裝可參考小編安裝編譯篇https://zhuanlan.zhihu.com/p/78689463。本篇小編基于Faiss的官方wiki實例展開,旨在讓大家快速入門Faiss。Faiss底層用c++實現并為用戶提供python接口,本篇我們以python示例Faiss用法,使用python接口前,需要下載numpy包用于faiss向量加載。
Faiss處理大規模d維向量近鄰檢索的問題,Faiss中所有向量以行矩陣的形式儲存和使用,實例中我們用xb表示所有待索引的向量集合 ,xq表示查詢向量集合,nb和nq分別表示xb、xq集合中向量數量。
構建待檢索向量和查詢向量
import numpy as np d = 64 # 向量維度 nb = 100000 # 待索引向量size nq = 10000 # 查詢向量size np.random.seed(1234) # 隨機種子確定 xb = np.random.random((nb, d)).astype('float32') xb[:, 0] += np.arange(nb) / 1000. #為了使隨機產生的向量有較大區別進行人工調整向量 xq = np.random.random((nq, d)).astype('float32') xq[:, 0] += np.arange(nq) / 1000.建立索引并添加向量
Faiss通過Index對象進行向量的封裝與預處理,Faiss提供了很多種索引類型,我們首先test暴力搜索精準L2距離搜索,對應的索引對象為IndexFlatL2。
所有向量在建立前需要明確向量的維度d,大多數的索引還需要訓練階段來分析向量的分布。但是,對于L2暴力搜索來說沒有訓練的必要。
Index對象訓練好之后,對于Index有兩個操作供調用,分別為add和search。add方法用于向Index中添加xb向量,search方法用于在add向量后的索引中檢索xq的若干近鄰。Index還有兩個狀態變量is_trained(bool類型,用于指示index是否已被訓練)和ntotal(指示索引的數量)。此外,index還有IDs添加的方法。
import faiss index = faiss.IndexFlatL2(d) # 建立索引 print(index.is_trained) # 輸出true index.add(xb) # 索引中添加向量 print(index.ntotal) # 輸出100000近鄰搜索
通過Index檢索xq中的數據,faiss支持批量數據檢索,通過search方法返回的檢索結果包括兩個矩陣,分別為近鄰向量的索引序號和xq中元素與近鄰的距離大小。
k = 4 # 返回每個查詢向量的近鄰個數 D, I = index.search(xb[:5], k) # 檢索check print(I) print(D) D, I = index.search(xq, k) #xq檢索結果 print(I[:5]) # 前五個檢索結果展示 print(I[-5:]) # 最后五個檢索結果展示檢索結果
check檢索結果
[[ 0 393 363 78]
[ 1 555 277 364]
[ 2 304 101 13]
[ 3 173 18 182]
[ 4 288 370 531]]
[[ 0. 7.17517328 7.2076292 7.25116253]
[ 0. 6.32356453 6.6845808 6.79994535]
[ 0. 5.79640865 6.39173603 7.28151226]
[ 0. 7.27790546 7.52798653 7.66284657]
[ 0. 6.76380348 7.29512024 7.36881447]]
xq檢索結果
[[ 381 207 210 477]
[ 526 911 142 72]
[ 838 527 1290 425]
[ 196 184 164 359]
[ 526 377 120 425]]
[[ 9900 10500 9309 9831]
[11055 10895 10812 11321]
[11353 11103 10164 9787]
[10571 10664 10632 9638]
[ 9628 9554 10036 9582]]
上面所示,IndexFlatL2是暴力檢索的索引,為了加速檢索speed,可以使用faiss的IndexIVFFlat索引對象。IndexIVFFlat的使用需要進行訓練階段,并需要指定其他索引作為量化器,與檢索相關的參數
為nlist和nprobe。IndexIVFFlat索引先利用粗量化器將檢索向量劃分到Voronoi單元中并建立倒排索引,檢索階段將根據輸入向量和probe參數定位到對應的Voronoi cell中進行近鄰搜素。
IndexIVFFlat檢索
nlist = 100 k = 4 quantizer = faiss.IndexFlatL2(d) # 量化器索引 index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2) # 指定用L2距離進行搜索,若不指定默認為內積 assert not index.is_trained index.train(xb) # 索引訓練 assert index.is_trained index.add(xb) # 向量添加 D, I = index.search(xq, k) # 檢索 print(I[-5:]) # 最后五個檢索結果 index.nprobe = 10 # 多探針檢索 D, I = index.search(xq, k) print(I[-5:]) #最后五個檢索結果檢索結果顯示
1probe
[[ 9900 10500 9831 10808]
[11055 10812 11321 10260]
[11353 10164 10719 11013]
[10571 10203 10793 10952]
[ 9582 10304 9622 9229]]
10probe
[[ 9900 10500 9309 9831]
[11055 10895 10812 11321]
[11353 11103 10164 9787]
[10571 10664 10632 9638]
[ 9628 9554 10036 9582]]
讀者可自行觀察測試各參數對檢索結果的影響。
本篇代碼可以在faiss中的 tutorial/ 目錄下查找。
Reference
https://github.com/facebookresearch/faiss/wiki
本篇內容在本人個人公眾號上也已發布,歡迎關注本人微信公眾號“勤菜鳥”。
總結
以上是生活随笔為你收集整理的faiss python安装_faiss入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我为什么鼓励工程师写blog
- 下一篇: MFC子窗口和父窗口(SetParent