欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請碼778899分享:nlp Faiss向量數(shù)據(jù)庫

柚子快報(bào)邀請碼778899分享:nlp Faiss向量數(shù)據(jù)庫

http://yzkb.51969.com/

Faiss(Facebook AI Similarity Search)向量數(shù)據(jù)庫是由Facebook AI研究院開發(fā)的一種高效相似性搜索和聚類的庫。Faiss不僅支持在高維空間中進(jìn)行高效的相似性搜索,還能夠在處理大規(guī)模數(shù)據(jù)集時(shí)展現(xiàn)出卓越的性能,尤其適用于圖像檢索、文本搜索、推薦系統(tǒng)和語音處理等多種應(yīng)用場景。?

在推薦系統(tǒng)中,F(xiàn)aiss可以用于快速查找用戶可能感興趣的物品或?qū)ふ揖哂邢嗨婆d趣的用戶。?在信息檢索領(lǐng)域,F(xiàn)aiss可以用于構(gòu)建文檔或圖像的相似性搜索引擎。在圖像識(shí)別領(lǐng)域,F(xiàn)aiss可以用于構(gòu)建圖像特征的索引,實(shí)現(xiàn)快速的相似圖像搜索和圖像聚類。

?安裝Faiss:

?cpu版本:

conda install -c pytorch faiss-cpu

?gpu版本:

conda install -c pytorch faiss-gpu

Faiss 處理固定維數(shù) d 的向量集合,通常為幾十到幾百個(gè)。這些集合可以存儲(chǔ)在矩陣中。我們假設(shè)采用行主存儲(chǔ),即向量編號(hào) i 的第 j 個(gè)分量存儲(chǔ)在矩陣的第 i 行、第 j 列中。Faiss 僅使用 32 位浮點(diǎn)矩陣。

import numpy as np

d = 64 # 設(shè)置向量的維度為64

nb = 100000 # 向量數(shù)量為100,000

nq = 10000 # 查詢向量的數(shù)量為10,000

np.random.seed(1234) # make reproducible

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. # 修改查詢向量的第一個(gè)維度

建立索引?

Faiss 是圍繞Index對(duì)象構(gòu)建的。它封裝了一組數(shù)據(jù)庫向量,并可選地對(duì)它們進(jìn)行預(yù)處理,以提高搜索效率。索引有很多種類型,我們將使用最簡單的版本,即對(duì)它們進(jìn)行強(qiáng)力的 L2 距離搜索:IndexFlatL2。

所有索引在構(gòu)建時(shí)都需要知道它們所操作的向量的維數(shù),當(dāng)索引建立并訓(xùn)練完成后,可以對(duì)索引進(jìn)行兩種操作:add和search。

當(dāng)我們說一個(gè)索引是否被“訓(xùn)練”時(shí),我們實(shí)際上是指該索引是否已經(jīng)通過某種方式優(yōu)化了其內(nèi)部結(jié)構(gòu),以便更有效地處理搜索查詢。?

import faiss

index = faiss.IndexFlatL2(d) # 創(chuàng)建一個(gè)IndexFlatL2類型的索引

print(index.is_trained) # 打印出索引是否已經(jīng)被訓(xùn)練

index.add(xb) # 將向量添加到索引中

print(index.ntotal)

IndexFlatL2索引是一種簡單的暴力搜索索引,它不需要訓(xùn)練過程,因?yàn)樗苯佑?jì)算查詢向量與數(shù)據(jù)庫中所有向量的L2距離,以找到最相似的向量。?

?

搜索~

可以在索引上執(zhí)行的基本搜索操作是k最近鄰搜索,即對(duì)于每個(gè)查詢向量,k在數(shù)據(jù)庫中找到其最近的鄰居。

此操作的結(jié)果可以方便地存儲(chǔ)在大小為nq-by-的整數(shù)矩陣中k,其中第 i 行包含查詢向量 i 的鄰居的 ID,按距離遞增排序。除了這個(gè)矩陣之外,該search操作還返回一個(gè)nq-by-k浮點(diǎn)矩陣,其中包含相應(yīng)的平方距離。

k = 4 # we want to see 4 nearest neighbors

D, I = index.search(xb[:5], k) # 在索引中搜索xb數(shù)組的前5個(gè)向量(xb[:5])的k個(gè)最近鄰居

print(I)

print(D)

D, I = index.search(xq, k) # 整個(gè)查詢集xq上搜索每個(gè)查詢向量的k個(gè)最近鄰居

print(I[:5]) # 前5個(gè)查詢向量的最近鄰居的索引位置

print(I[-5:])

D:包含了查詢向量與其找到的最近鄰居之間的距離。?I:也是一個(gè)數(shù)組,但它包含的是最近鄰居在索引中的位置或索引。

結(jié)果:

?

?由于索引中未添加任何向量,因此無法進(jìn)行有效的相似性搜索。在實(shí)際應(yīng)用中,我們需要先將向量添加到索引中,然后才能進(jìn)行搜索操作。

?向索引添加向量:

nb = 100000 # 假設(shè)有100,000個(gè)向量

xb = np.random.random((nb, d)).astype('float32') # 生成隨機(jī)向量數(shù)據(jù),100000個(gè)64維數(shù)據(jù)

index.add(xb) # 將向量數(shù)據(jù)添加到索引中

# 優(yōu)化索引(跳過)

?結(jié)果:

?后兩個(gè)為實(shí)際的搜索輸出(前五和后五)。

更快的搜索!

為了加快搜索速度,可以將數(shù)據(jù)集分割成塊。我們在 d 維空間中定義 Voronoi 單元,每個(gè)數(shù)據(jù)庫向量都位于其中一個(gè)單元中。在搜索時(shí),僅將查詢 x 所在的單元中包含的數(shù)據(jù)庫向量 y 和一些相鄰的向量與查詢向量進(jìn)行比較。

這是通過IndexIVFFlat索引完成的。這種類型的索引需要一個(gè)訓(xùn)練階段,可以對(duì)具有與數(shù)據(jù)庫向量相同分布的任何向量集合執(zhí)行。

還IndexIVFFlat需要另一個(gè)索引,即量化器,它將向量分配給 Voronoi 單元。每個(gè)單元由一個(gè)質(zhì)心定義,找到向量所在的 Voronoi 單元就是在質(zhì)心集合中找到向量的最近鄰居。這是另一個(gè)索引的任務(wù),通常是IndexFlatL2。

nlist = 100

# nlist指定IndexIVFFlat索引中聚類中心的數(shù)量

k = 4

quantizer = faiss.IndexFlatL2(d)

index = faiss.IndexIVFFlat(quantizer, d, nlist)

# 這個(gè)索引中,quantizer 被用作內(nèi)部機(jī)制來量化向量,并將它們分配到倒排文件中的不同聚類中心

# assert 語句用于驗(yàn)證索引的狀態(tài),確保其在訓(xùn)練前后的行為符合預(yù)期。

assert not index.is_trained

index.train(xb)

print("~~訓(xùn)練完成~~")

assert index.is_trained

index.add(xb)

D, I = index.search(xq, k)

print(I[-5:])

index.nprobe = 10 # 在搜索時(shí)控制要檢查的聚類中心的數(shù)量

D, I = index.search(xq, k)

print(I[-5:])

# quantizer 被“嵌入”到 index 中,是因?yàn)?index 需要使用 quantizer 的量化功能來將向量分配到正確的聚類中心,并實(shí)現(xiàn)高效的搜索。

??IndexIVFFlat索引首先將向量空間劃分為nlist個(gè)聚類中心,然后使用quantizer(IndexFlatL2索引)來量化這些中心。??在搜索時(shí),IndexIVFFlat索引會(huì)先確定查詢向量所屬的聚類中心,然后只在該中心的向量中執(zhí)行搜索,從而大大減少了計(jì)算量。??xb(代表數(shù)據(jù)集的一部分或全部)來訓(xùn)練索引。這是為了優(yōu)化量化器或聚類中心。??我們重新初始化了索引 index,所以第一次添加的操作就沒有影響了。?每創(chuàng)建一個(gè)索引,就相當(dāng)于在向量搜索的上下文中創(chuàng)建了一個(gè)獨(dú)立的、用于存儲(chǔ)和查詢向量的數(shù)據(jù)結(jié)構(gòu)。

搜索方法有兩個(gè)參數(shù):nlist,即單元格數(shù)量,以及nprobe,即執(zhí)行搜索時(shí)訪問的單元格數(shù)量(共nlist)

流nprobe = 10:?

流nprobe = 1 :

?設(shè)置 nprobe = nlist 會(huì)得到與強(qiáng)力搜索相同的結(jié)果(但速度較慢)。?

Faiss支持將索引保存到磁盤文件中,并在需要時(shí)重新加載它們。通過保存和重新加載索引,可以在不同的會(huì)話或應(yīng)用程序中重用索引:

# 保存索引

faiss.write_index(index, 'index.faiss')

# 加載索引

index = faiss.read_index('index.faiss')

?

柚子快報(bào)邀請碼778899分享:nlp Faiss向量數(shù)據(jù)庫

http://yzkb.51969.com/

相關(guān)閱讀

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19465769.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄