日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

faiss python安装_faiss入门

發布時間:2025/3/12 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。