深入理解simhash原理
一、LSH 介紹
????LSH(Locality sensitive hashing)是局部敏感性hashing,它與傳統的hash是不同的。傳統hash的目的是希望得到O(1)的查找性能,將原始數據映射到相應的桶內。
????LSH的基本思想是將空間中原始數據相鄰的2個數據點通過映射或者投影變換后,這兩個數據點在新的空間中的相鄰概率很大,不相鄰的點映射到同一個桶的概率小。我們可以看到將一個在超大集合內查找相鄰元素的問題轉化為了在一個很小的集合內查找相鄰元素的問題,顯然計算量下降了很多。下面借用一幅圖來表示:
LSH滿足如下條件:
ifd(x,y)≤d1,thenP(h(x)=h(y))≥P1
ifd(x,y)≥d2,thenP(h(x)=h(y))≤P2
?其中d(x,y)表示x和y之間的距離,d1 < d2,h(x)和h(y)分別表示對x和y進行hash變換。
?滿足以上兩個條件的hash functions稱為(d1,d2,p1,p2)-sensitive。而通過一個或多個(d1,d2,p1,p2)-sensitive的hash function對原始數據集合進行hashing生成一個或多個hash table的過程稱為Locality-sensitive Hashing.
二、Simhash 算法
????SimHash 算法的輸入是一個向量,輸出是一個f位的簽名值。設輸入的是一個文檔的特征集合,每個特征有一定的權重。
Simhash 算法如下:
- 對每一個特征:
用傳統的hash算法對該特征產生一個f位的簽名b.
對于i=1tof:
如果b的第i位為1,則 v??S加上該特征的權重
否則,v??的第i個元素減去該特征的權重 - 如果v? 的第i個元素大于0, S 的第i位為1,否則為0
- 輸出S作為簽名
如下圖所示:
SimHash是由隨機超平面hash算法演變而來的,對于一個n維向量v? , 要得到一個f位的簽名(f<<n),算法如下:
1.隨機產生f個n維的向量r??1,r??2,…,r??f
2.對每一個向量r??i,如果v??與r??i的點積大于0,則最終簽名的第i位為1,否則為0????上述算法相當于隨機產生了f個n維超平面,每個超平面將v所在的空間一分為二。v在這個超平面上方則得到一個1,否則得到一個0,然后將得到的f個0或1組合起來成為一個f維的簽名。
????如果兩個向量u??,v??的夾角為θ,則一個隨機超平面將它們分開的概率為θπ,因此u??,v??的簽名的對應位不同的概率等于θπ,所以,我們可以用兩個向量的簽名的不同的對應位的數量,即漢明距離,來衡量這兩個向量的差異程度。
????在simhash中并沒有直接產生用于分割空間的隨機向量,而是間接產生的:第k個特征的hash簽名的第i位拿出來,如果為0,則改為-1,如果為1則不變,作為第i個隨機向量的第k維。由于hash簽名是f位的,因此這樣能產生f個隨機向量,對應f個隨機超平面。
????simhash算法得到的兩個簽名的漢明距離可以用來衡量原始向量的夾角。這其實是一種降維技術,將高維的向量用較低維度的簽名來表征。衡量兩個內容相似度,需要計算漢明距離。漢明距離是兩個字符串對應位置的不同字符的個數:
1011101 與1001001 之間的漢明距離是2。
總結
以上是生活随笔為你收集整理的深入理解simhash原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UNIX再学习 -- 线程
- 下一篇: UNIX再学习 -- 线程同步