最近鄰搜尋就是在空間資料庫中找出包含查詢關鍵字且離查詢點最近的k個資料點,其中k為常數。2.1ir2-tree(information retrieval r-tree)
基本思想:(1) 利用雜湊將每個關鍵字對映為位串(bit string);(2) 用r樹將組織所有資料;
(3) 將位串資訊嵌入到r樹結點中作為關鍵字資訊,葉子結點的關鍵字資訊為該點的位串,非葉子結點中關鍵字資訊為其所有孩子的關鍵字資訊的與(&)。
如圖2-1所示,關鍵字對映的位串如表2-1所示,建立的ir2-tree結構如圖2-2所示。
圖2-1 資料圖
表2-1 關鍵字位串對映表
圖2-2 ir2-tree
檢索過程:
(1) 求出所有查詢關鍵字的「與(&)」qk;
(2) 從ir2-tree樹根開始遍歷關鍵字資訊與包含qk的所有結點且離查詢點較近的結點(非葉子指到矩形的距離);
(3) 當該結點為葉子結點時需驗證是否確實包含所有關鍵字,若包含則為結果;反之繼續計算,直到找到k個結果。
2.2inverted index
基本思想:
(1) 建立關鍵字倒排表;
(2) 查詢包含關鍵字的倒排,對鍊錶求交集可得包含全部關鍵字的結點。
(3) 計算節點到查詢點的距離,可得top-k。
例,如圖2-3 a為資料圖,圖2-3 b為結點包含的關鍵字資訊,其倒排表如圖2-4所示。
圖2-3
圖 2-4 倒排表
現有方法分析:ir2-tree存在錯誤命中(false hit)的問題造成多次的無效訪問;inverted index方法需要多次的i/o操作去得到位置資訊。針對於此作者提出了si-index(spatialinverted list)結構並利用z-curve對倒排表進行了壓縮儲存。
作者的si-index倒排中除了儲存結點id外還儲存了位置資訊,如圖3-1所示為圖2-3 a的si-index。檢索方法與invertedindex類似,不再重複。
圖 3-1 si-index
壓縮原理:如有一組有序數12 , 15 , 23 , 24 , 41 , 50 , 52 , 59,若直接儲存需要log259 = 6個bit位。如果只儲存第乙個數,其它數隻存與它前乙個的差值,即儲存序列:12 , 3 , 8 , 1 , 17 , 9 , 2 , 7,僅需要⌈log217⌉ = 5個bit位。
以二維空間作為例子敘述壓縮儲存空間全過程。對於圖2-3中的結點p4 = (5, 4) = (010,100),令z-value(p4) = 011000,注意到紅色的部分來自x座標,黑色的為縱座標。類似可將每乙個結點的座標轉化為乙個數。隨後將這些數排序,按照壓縮原理進行壓縮儲存。給從新排序的結點以新的id,從而id也可以壓縮且與座標保持一致性。如圖3-2為圖2-3的壓縮儲存結果。
圖 3-2 壓縮儲存結果
為了方便查詢,進一步將壓縮儲存結果進行了分塊儲存,每一塊開始均為真實值。
檢索過程與inverted index類似,但需要解壓縮。
採用壓縮的方式「提公升」了記憶體儲存的資訊量,或可將全部資訊放入記憶體,只在必要時對相應的資訊進行解壓縮,但對於i/o操作還是具有絕對的優勢。
**:fast nearest neighborsearch with keywords
最近鄰居法KNN
在模式識別領域中,最近鄰居法 knn演算法,又譯k 近鄰演算法 是一種用於分類和回歸的非引數統計方法。1 在這兩種情況下,輸入包含特徵空間中的k個最接近的訓練樣本。最近鄰居法採用向量空間模型來分類,概念為相同類別的案例,彼此的相似度高,而可以藉由計算與已知類別案例之相似度,來評估未知類別案例可能的分...
最近鄰搜尋和近似最近鄰搜尋(NN和ANN)和庫
這樣查詢返回的前k個向量並不一定是最相似的k個向量,衡量ann演算法好不好的乙個依據是召回,每次ann請求返回的k個結果與使用暴力查詢的k個結果去比較,如果完全一致,說明是最好的。因為省了搜尋時間卻沒有影響效果。目前的ann演算法有基於圖 hnswlib 的,基於樹 pysparnn 的,基於雜湊 ...
面經筆記 範圍搜尋 最近鄰搜尋
kd樹 參考 上文中一直在講最近鄰問題,也就是說只找最近的那唯一乙個鄰居,但如果現實中需要我們找到k個最近的鄰居。該如何做呢?對的,之前blog內曾相近闡述過尋找最小的k個數的問題,顯然,尋找k個最近鄰與尋找最小的k個數的問題如出一轍。用大根堆保持k個最小的距離,然後用根的距離 也就是其中最大的乙個...