最近鄰搜尋和近似最近鄰搜尋(NN和ANN)和庫

2021-10-04 02:21:38 字數 1980 閱讀 1643

這樣查詢返回的前k個向量並不一定是最相似的k個向量,衡量ann演算法好不好的乙個依據是召回,每次ann請求返回的k個結果與使用暴力查詢的k個結果去比較,如果完全一致,說明是最好的。因為省了搜尋時間卻沒有影響效果。

目前的ann演算法有基於圖(hnswlib )的,基於樹(pysparnn)的,基於雜湊(nearpy這個庫)等,並且有很多關於ann演算法的實現,開源的很多,如annoy, faiss,nmslib, falconn,flann等。

更詳細的一些測試在這個**有資料 作者比較了不同的距離度量方式及在不同資料集的效果。

我測試過的,一分為兩類:稀疏向量和非稀疏向量

首先:稀疏向量是指維度比較多,而且向量的很多元素是0,啁密向量指零元素較少,向量的維度也就幾十到幾百。

如果上萬維的一般是稀疏向量(一萬個詞語詞庫句子搜尋),這樣的pyspann最好。

其次是周密向量,那麼faiss應該記憶體和速度比較均衡 。

faiss的安裝如下:

1 sudo apt-get install libopenblas-dev liblapack3 python-numpy python-dev

2 apt-get install libblas-dev libatlas-dev liblapack-dev

swig install

git clone

cd swig

sudo apt-get install automake

./autogen.sh

./configure

sudo apt-get install bison flex

make

sudo make install

這樣的演算法成千上百,對此進行評測

評測資料集如下

dataset

dimensions

train size

test size

neighbors

distance

download

deep1b

969,990,000

10,000

100angular

hdf5 (3.6gb)

fashion-mnist

78460,000

10,000

100euclidean

hdf5 (217mb)

gist

9601,000,000

1,000

100euclidean

hdf5 (3.6gb)

glove

251,183,514

10,000

100angular

hdf5 (121mb)

glove

501,183,514

10,000

100angular

hdf5 (235mb)

glove

1001,183,514

10,000

100angular

hdf5 (463mb)

glove

2001,183,514

10,000

100angular

hdf5 (918mb)

kosarak

27983

74,962

500100

jaccard

hdf5 (2.0gb)

mnist

78460,000

10,000

100euclidean

hdf5 (217mb)

nytimes

256290,000

10,000

100angular

hdf5 (301mb)

sift

1281,000,000

10,000

100euclidean

hdf5 (501mb)

近似最近鄰搜尋的QALSH方法 閱讀筆記

lsh和它的變體是解決高維歐氏空間下c 近似最近鄰 c ann 搜尋問題的著名索引方法。傳統上,lsh函式在某種意義上是以未知查詢的方式構建,即在任何查詢到達之前劃分桶。然而,距離乙個查詢越近的目標可能被劃分在不同的桶中是令人不快的。由於利用yi遺忘查詢桶劃分,針對外存的最先進的lsh方案,即c2l...

最近鄰居搜尋 壓縮儲存

最近鄰搜尋就是在空間資料庫中找出包含查詢關鍵字且離查詢點最近的k個資料點,其中k為常數。2.1ir2 tree information retrieval r tree 基本思想 1 利用雜湊將每個關鍵字對映為位串 bit string 2 用r樹將組織所有資料 3 將位串資訊嵌入到r樹結點中作為關...

面經筆記 範圍搜尋 最近鄰搜尋

kd樹 參考 上文中一直在講最近鄰問題,也就是說只找最近的那唯一乙個鄰居,但如果現實中需要我們找到k個最近的鄰居。該如何做呢?對的,之前blog內曾相近闡述過尋找最小的k個數的問題,顯然,尋找k個最近鄰與尋找最小的k個數的問題如出一轍。用大根堆保持k個最小的距離,然後用根的距離 也就是其中最大的乙個...