Locality Sensitive Hashing
https://sanzo.top/Algorithm/Locality-Sensitive-Hashing
試想你有一些文本它們可能有所重復(fù),你需要對他們進行去重處理,傳統(tǒng)的做法是O(N2)O(N^2)O(N2),即對所有的文本對進行相似度的計算,然后進行排序得到結(jié)果。
假設(shè)N=106N=10^6N=106,需要進行N(N?1)2=5×1011\frac{N(N-1)}{2} = 5\times10^{11}2N(N?1)?=5×1011次計算,在果每秒計算10610^6106次,一天大概10510^5105秒,那么需要5天的時間,如果N=107N = 10^7N=107,則需要超過一年的時間。
顯然O(N2)O(N^2)O(N2)的復(fù)雜度不可取,Locality-Sensitive-Hashing(LSH)利用hash把相似高的文本分到同一個桶中,這樣過濾了大量不同的本文將計算降低到O(N)O(N)O(N)。
對于具體的任務(wù),一般分為一下三個步驟:
接下來具體介紹這三個步驟。
Shingling
一般特征矩陣需要自己獲取,對于給定的文本,可以通過Shingling的方法構(gòu)造特征集合。
例如文本為”abcabe“,可以構(gòu)造為k=2k=2k=2的集合,D={ab,bc,ca,be}D = \{ab, bc, ca, be\}D={ab,bc,ca,be},對于短的文本kkk一般取5,對于長的文本kkk取10。
我們可以對集合進行hash,將一個長的字符串表示為一個4字節(jié)的數(shù)字,h(D)={1,3,2,7}h(D) = \{1, 3, 2, 7\}h(D)={1,3,2,7}。
得到文本的集合之后,就可以通過計算集合的相似度,從而判斷兩個文本的相似性。
在計算相似度時,這里采用Jaccard similarity,sim(D1,D2)=∣D1∩D2∣∣D1∪D2∣sim(D_1, D_2) = \frac{|D_1\cap D_2|}{|D_1\cup D_2|}sim(D1?,D2?)=∣D1?∪D2?∣∣D1?∩D2?∣?。
另外我們可以把集合表示為bit vector,這樣求交集相當(dāng)于AND運算,并集相當(dāng)于OR運算。
MinHashing
一般文本的集合都非常大,MinHashing相當(dāng)于降維,同時近似的保持相似度的準(zhǔn)確度。
MinHashing的具體做法時,對Shingles的集合進行隨機打亂,bit vector為1的下標(biāo)作為新的特征值。
MinHash相等的概率剛好等于Jaccard Similarity值,Pr[hπ(D1)=hπ(D2)]=Jaccard(C1,C2)Pr[h_\pi(D_1) = h_\pi(D_2)] = Jaccard(C_1, C_2)Pr[hπ?(D1?)=hπ?(D2?)]=Jaccard(C1?,C2?)。
證明如下:
對于兩個document的集合來說,一共有三種情況:
- 對應(yīng)維度全為1,設(shè)有xxx個。
- 對應(yīng)維度只有一個1,設(shè)有y個。
- 對應(yīng)維度全為0。
其中全為0的情況不影響MinHash的值,第一個非零行為第一類的概率為xx+y\frac{x}{x + y}x+yx?。
另外從全排列考慮,第一行為第一類的情況有x(x+y?1)!x(x+y-1)!x(x+y?1)!,全排列為(x+y)!(x+y)!(x+y)!,即對特征進行全排列后,MinHash相等的次數(shù)即為Jaccard Similarity。
因此我們可以使用MinHash近似表示Jaccard Similarity,同時將長的vector壓縮為短的簽名。
假設(shè)有K=100K=100K=100個hash函數(shù),對于每一列CCC和hash函數(shù)kik_iki?,初始化sig(C)[i]=∞sig(C)[i]=\inftysig(C)[i]=∞,對于每一行的非零值,如果ki(j)<sig(C)[i]k_i(j) < sig(C)[i]ki?(j)<sig(C)[i],則更新sig(C)[i]=ki(j)sig(C)[i] = k_i(j)sig(C)[i]=ki?(j)。
LSH
通過MinHashing將特征矩陣轉(zhuǎn)化為小的簽名矩陣,接下來LSH將簽名矩陣劃分為bbb個band,每個band有rrr行,len(sig)=b×rlen(sig) = b\times rlen(sig)=b×r。
對于每個band,它們包含整體簽名的一部分,將這部分簽名通過hash映射到不同的桶中,如果兩個簽名相同它們就會映射到同一個桶中,經(jīng)過b次映射,兩個節(jié)點至少有一次被分到同一個桶中,我們就認(rèn)為這兩個節(jié)點的相似度更高。
假設(shè)兩個簽名的相似度為ttt,那么在同一個band中每一行都相同的概率為trt^rtr,至少有一行不同的概率為1?tr1-t^r1?tr,所有的band都不行同的概率為(1?tr)b(1-t^r)^b(1?tr)b,至少有一個band的相同的概率為1?(1?tr)b1-(1-t^r)^b1?(1?tr)b。
另外bbb和rrr是可調(diào)節(jié)的參數(shù)。
參考文獻
Finding Similar Items
Mining of Massive Datasets
總結(jié)
以上是生活随笔為你收集整理的Locality Sensitive Hashing的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派小车(远程控制、PWM变速、超声波
- 下一篇: 新博客地址: https://sanzo