minHash最小哈希原理

前言

       在數據挖掘中,一個最基本的問題就是比較兩個集合的類似度。一般經過遍歷這兩個集合中的全部元素,統計這兩個集合中相同元素的個數,來表示集合的類似度;這一步也能夠當作特徵向量間類似度的計算(歐氏距離,餘弦類似度)。當這兩個集合裏的元素數量異常大(特徵空間維數很大),同時又有不少個集合須要判斷兩兩間的類似度時,傳統方法會變得十分耗時,最小哈希(minHash)能夠用來解決該問題。html

Jaccard類似度

       在本例中,咱們僅探討集合的類似度,先來看Jaccard類似度。假設有兩個集合A,B,則算法

       Jaccard(A, B)= |A ∩ B| / |A ∪ B|,咱們舉一個例子:ruby

       在上述例子中,sim(A,B)=2/7。函數

minHash最小哈希

       假設如今有4個集合,分別爲S1,S2,S3,S4;其中,S1={a,d}, S2={c}, S3={b,d,e}, S4={a,c,d},因此全集U={a,b,c,d,e}。咱們能夠構造以下0-1矩陣:工具

       爲了獲得各集合的最小哈希值,首先對矩陣進行隨機行打亂,則某集合(某一列)的最小哈希值就等於打亂後的這一列第一個值爲1的行所在的行號。舉一個例子:spa

       定義一個最小哈希函數h,用於模擬對矩陣進行隨機行打亂,打亂後的0-1矩陣爲.net

       如圖所示,h(S1)=2, h(S2)=4, h(S3)=0, h(S4)=2。htm

       在通過隨機行打亂後,兩個集合的最小哈希值相等的機率等於這兩個集合的Jaccard類似度,證實以下:
blog

       現僅考慮集合S1和S2,那麼這兩列所在的行有下面3種類型:
       一、S1和S2的值都爲1,記爲X
       二、只有一個值爲1,另外一個值爲0,記爲Y
       三、S1和S2的值都爲0,記爲Z
索引

       S1和S2交集的元素個數爲x,並集的元素個數爲x+y,因此sim(S1,S2) = Jaccard(S1,S2) = x/(x+y)。接下來計算h(S1)=h(S2)的機率,通過隨機行打亂後,從上往下掃描,在碰到Y行以前碰到X行的機率爲x/(x+y),即h(S1)=h(S2)的機率爲x/(x+y)。

最小哈希簽名

       那麼,怎樣獲得P( h(S1)=h(S2) )呢?咱們僅須要進行N次哈希運算模擬N次隨機行打亂,而後統計|h(S1)=h(S2)|,就有 P=|h(S1)=h(S2)| / N 了。有了上一章節的證實,咱們就能夠經過屢次進行最小哈希運算,來構造新的特徵向量,也就是完成了降維,獲得的新矩陣稱爲最小哈希簽名矩陣。舉一個例子,假設進行2次最小哈希運算,h1(x)=(x+1) mod 5,h2(x) = (3*x+1) mod 5,能夠獲得簽名矩陣SIG:

       計算獲得sim(S1,S4)=1,sim(S1,S3)=0.5。固然本例數據量過小,簽名矩陣的估計值跟真實Jaccard偏差較大。

       這裏提供一種僅掃描一次就能夠獲得最小簽名矩陣的算法:

       令SIG(i,c)表示簽名矩陣中第i個哈希函數在第c列上的元素。開始時,將全部的SIG(i,c)初始化爲Inf(無窮大),而後對第r行進行以下處理:
1. 計算h1(r), h2(r)…hn(r);
2. 對於每一列c:
       a) 若是c所在的第r行爲0,則什麼都不作;
       b) 若是c所在的第r行爲1,則對於每一個i=1,2…n,將SIG(i,c)=min(SIG(i,c),hi(r))。

       再看不懂的能夠參考minHash(最小哈希)和LSH(局部敏感哈希)

MinHash的應用

       MinHash能夠應用在推薦系統中,將上述0-1矩陣的橫軸當作商品,豎軸當作用戶,有成千上萬的用戶對有限的商品做出購買記錄,具體能夠參考基於協同過濾,NMF和Baseline的推薦算法一文。MinHash也能夠應用在天然語言處理的文本聚類中,將上述0-1矩陣的橫軸當作文檔,豎軸當作詞彙或n-gram。這裏我提出一種基於依賴樹的同義詞聚類算法:

       假設現有沒有語法錯誤的文本集,咱們使用依賴樹工具獲得上圖的邊,先用TF-IDF逆文檔頻率過濾獲得咱們想要聚類的詞彙,而後用倒排索引創建相似ESA的詞彙-概念向量,例如:

       發展:nsubj(~,交通),advmod(~,比較),relcl(地方,~),mark(~,的)

       發達:nsubj(~,交通),advmod(~,比較),relcl(地方,~),mark(~,的)

       這樣,就有待聚類的詞彙有限,概念數量龐大的情形,應用minHash完成降維,再來聚類,具體能夠參考從n-gram中文文本糾錯,到依存樹中文語法糾錯以及同義詞查找一文。

LSH局部敏感哈希

       咱們獲得簽名矩陣後,對集合仍是須要進行兩兩比較,假如集合數量也極度龐大的話,咱們但願僅比較那些類似度可能很高的集合,而直接忽略那些類似度很低的集合,LSH就能夠用來解決該問題。

       LSH用到「桶」的概念,直接舉一個例子,現有一個12行的簽名矩陣,咱們設置桶大小爲3,則可分爲4個桶,以下圖:

       對於S2,咱們僅須要尋找那些桶相同的集合來計算類似度,例如:

       咱們僅須要計算sim(S2, S3),sim(S2, S4),sim(S2, S5),由於這些集合出現過與S2桶相同的狀況。再不懂能夠看minHash(最小哈希)和LSH(局部敏感哈希)一文。

Reference

minHash(最小哈希)和LSH(局部敏感哈希)

MinHash (最小哈希)

相關文章
相關標籤/搜索