局部敏感哈希(local sensitive hash,LSH)

高維數據檢索(high-dimentional retrieval)是一個有挑戰的任務。對於給定的待檢索數據(query),對數據庫中的數據逐一進行相似度比較是不現實的,它將耗費大量的時間和空間。這裏我們面對的問題主要有兩個,第一,兩個高維向量的相似度比較,第二,數據庫中龐大的數據量。最終檢索的複雜度是由這兩點共同決定的。

    針對第一點,人們開發出很多hash算法,對原高維數據降維。針對第二點,我們希望能在檢索的初始階段就排除一些數據,減小比較的次數。而LSH局部敏感哈希算法恰好滿足了我們的需求。其基本思想如下:

    假設原數據庫中某個高維向量x,維數爲n。對其進行漢明化操作,得到n維的二值向量x'。定義m個hash函數,每個hash函數抽取二值向量x'中的k位作爲哈希值,這樣每個原始高維數據x就會對應m個k位的二值向量。然後,對數據庫中的所有原始向量,如果它們對某個具體的哈希函數具有相同的哈希值,那麼就把它們放入一個“籃子”裏。這裏的“籃子”具有兩個屬性,一是它所屬於的hash函數,二是它所對應的哈希值,也就是說,對於兩個高維向量x和y來說,只有它們對於同一個hash函數具有相同響應的時候,纔會被投入相同的“籃子”中。

    這樣,我們的檢索過程也變得清晰明瞭。對於待檢索向量q,在將其漢明化之後,計算其m個hash函數值,然後將每個hash函數值對應的“籃子”中的向量取出來,這樣我們得到了m個“籃子”(每個籃子對應一個hash函數),將這m個“籃子”中的向量取並集,得到集合A。從直觀上來講,A中的向量個數一定遠遠小於原數據庫中的向量個數,這時將q與A中向量一一對比,就能得到檢索結果。

    LSH算法可以看做這樣的兩步,第一步將與q完全不相關的向量剔除掉,只保留與q相似的概率較大的向量作爲待比較向量,第二步就是講q與剩餘向量逐一對比,注意這裏我們仍然可以使用現有的一些降維或者哈希算法提高運算效率。

    那麼,爲什麼以上的局部敏感哈希算法能夠保留與q具有高相似度的向量呢?首先要感謝我們所用的哈希函數的形式,即對於二值向量隨機取k位,這樣就保證了相似的向量在哈希映射後仍然相似的概率比較大,而這個特點也是“局部敏感哈希算法”中“局部敏感”的意義所在。因此對這個問題,直觀上的理解是,如果對於某個哈希函數來說,兩個向量具有相同的響應,說明它們在某個概率下是相似的,如果對於m個哈希函數來說,兩個向量的響應都相同,就說明它們相似的可能性更大了。

    對於LSH的有效性證明,見原論文。

參考資料:

Similarity estimation techniques from rounding algorithms. STOC, 2002.

Finding Interesting Associations without Support Pruning.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章