這樣查詢返回的前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個最小的距離,然後用根的距離 也就是其中最大的乙個...