日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

海量数据集利用Minhash寻找相似的集合【推荐优化】

發布時間:2024/3/26 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海量数据集利用Minhash寻找相似的集合【推荐优化】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MinHash?首先它是一種基于?Jaccard Index?相似度的算法,也是一種?LSH?的降維的方法,應用于大數據集的相似度檢索、推薦系統。下邊按我的理解介紹下MinHash

問題背景

給出N個集合,找到相似的集合對,如何實現呢?直觀的方法是比較任意兩個集合。當N比較小時,比如K級,Jaccard算法可以在接受的時間范圍內完成,比B級,甚至P級,那么需要的時間是不能夠被接受的,舉例:對于Indeeed美國的網站用戶來說(五千萬的訪問量),在Mahout中的用戶間相似度是通過在O(n2)復雜度下的用戶間兩兩比較的來實現的,假設一臺計算機每秒可以計算1Billion=1,000,000,000對集合是否相同,這個比較的數量將達到50,000,000**2次,約15小時,這是難以接受的!

Jaccard相似度計算雖然比較精確,但是推薦是一個非精確匹配問題(N個集合中只有少數幾對集合相似,絕大多數集合都不等呢?那么根據上述算法,絕大多數檢測的結果是兩個結合不相似,可以說這些檢測“浪費了計算時間”)。如果能找到一種算法,將大體上相似的集合聚到一起,縮小比對的范圍,這樣只用檢測較少的集合對,就可以找到絕大多數相似的集合對,大幅度減少時間開銷。雖然犧牲了一部分精度,但是如果能夠將時間大幅度減少,這種算法還是可以接受的。

啟發:貢獻者戴夫格里菲思從一篇谷歌新聞學術論文上看到了最小哈希方法。最小哈希(或者最小獨立序列)允許近似計算杰卡德相似度。將這一方法應用到兩個用戶都點擊過的職位上,我們發現兩個用戶有更多共同的職位點擊,那么他們的杰卡徳相似度就越高。為所有的用戶對計算杰卡徳相似度的復雜度是O(n^2),而有了最小哈希后,我們可以將復雜度降到O(n)。

接下來的內容講解如何使用Minhash和LSH(Locality-sensitive Hashing)來實現上述目的,在相似的集合較少的情況下,可以在O(n)時間找到大部分相似的集合對。

Jaccard相似度

判斷兩個集合是否相等,一般使用稱之為Jaccard相似度的算法(后面用Jac(S1,S2)來表示集合S1和S2的Jaccard相似度)。舉個列子,集合X = {a,b,c},Y = {b,c,d}。那么Jac(X,Y) = 2 / 3 = 0.67。也就是說,結合X和Y有67%的元素相同。下面是形式的表述Jaccard相似度公式:

Jac(X,Y) = |X∩Y| / |X∪Y|

也就是兩個結合交集的個數比上兩個集合并集的個數。范圍在[0,1]之間。

Minhash降維

最近的一個由斯坦福大學教授萊斯科維克、拉賈羅曼和厄爾曼講解的Coursera課程“挖掘海量數據集”,非常詳細的解釋了最小哈希。他們書的第三章——“挖掘海量數據集”,解釋了最小哈希背后的數學證明原理。

Minhash可以幫助我們解決時間復雜度這個問題。舉例:S1?= {a,d,e},S2?= {c, e},設全集U = {a,b,c,d,e}。集合可以如下表示:

行號

元素

S1

S2

類別

1

a

1

0

Y

2

b

0

0

Z

3

c

0

1

Y

4

d

1

0

Y

5

e

1

1

X

表1

表1中,列表示集合,行表示元素,值1表示某個集合具有某個值,0則相反(X,Y,Z的意義后面討論)。Minhash算法大體思路是:采用一種hash函數,將元素的位置均勻打亂,然后將新順序下每個集合第一個元素作為該集合的特征值。比如哈希函數h1(i) = (i + 1) % 5,其中i為行號。作用于集合S1和S2,得到如下結果:

行號

元素

S1

S2

類別

1

e

1

1

X

2

a

1

0

Y

3

b

0

0

Z

4

c

0

1

Y

5

d

1

0

Y

Minhash

e

e

?

?

?

表2

這時,Minhash(S1) = e,Minhash(S2) = e。也就是說用元素e表示S1,用元素e表示集合S2。那么這樣做是否科學呢?進一步,如果Minhash(S1)?等于Minhash(S2),那么S1是否和S2類似呢?

論證:最小哈希(或者最小獨立序列)允許近似計算杰卡德相似度

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?P(Minhash(S-1) = Minhash(S2)) = Jac(S1,S2)

在哈希函數h1均勻分布的情況下,集合S1的Minhash值和集合S2的Minhash值相等的概率等于集合S1與集合S2的Jaccard相似度,下面簡單分析一下這個結論。

S1和S2的每一行元素可以分為三類:

l??X類?均為1。比如表2中的第1行,兩個集合都有元素e。

l??Y類?一個為1,另一個為0。比如表2中的第2行,表明S1有元素a,而S2沒有。

l??Z類?均為0。比如表2中的第3行,兩個集合都沒有元素b。

這里忽略所有Z類的行,因為此類行對兩個集合是否相似沒有任何貢獻。由于哈希函數將原始行號均勻分布到新的行號,這樣可以認為在新的行號排列下,任意一行出現X類的情況的概率為|X|/(|X|+|Y|)。這里為了方便,將任意位置設為第一個出現X類行的行號。所以P(第一個出現X類) = |X|/(|X|+|Y|) = Jac(S1,S2)。這里很重要的一點就是要保證哈希函數可以將數值均勻分布,盡量減少沖撞。

?

一般而言,會找出一系列的哈希函數,比如h個(h << |U|),為每一個集合計算h次Minhash值,然后用h個Minhash值組成一個摘要來表示當前集合(注意Minhash的值的位置需要保持一致)。舉個列子,還是基于上面的例子,現在又有一個哈希函數h2(i) = (i -1)% 5。那么得到如下集合:

行號

元素

S1

S2

類別

1

b

0

0

Z

2

c

0

1

Y

3

d

1

0

Y

4

e

1

1

X

5

a

1

0

Y

Minhash

d

c

?

?

?

表3

?

所以,現在用摘要表示的原始集合如下:

哈希函數

S1

S2

h1(i) = (i + 1) % 5

e

e

h2(i) = (i - 1) % 5

d

c

表4

從表四還可以得到一個結論,令X表示Minhash摘要后的集合對應行相等的次數(比如表4,X=1,因為哈希函數h1情況下,兩個集合的minhash相等,h2不等):

X ~ B(h,Jac(S1,S2))

X符合次數為h,概率為Jac(S1,S2)的二項分布。那么期望E(X) = h * Jac(S1,S2) = 2 * 2 / 3 = 1.33。也就是每2個hash計算Minhash摘要,可以期望有1.33元素對應相等。

所以,Minhash在壓縮原始集合的情況下,保證了集合的相似度沒有被破壞。

LSH –?局部敏感哈希

現在有了原始集合的摘要,但是還是沒有解決最初的問題,仍然需要遍歷所有的集合對,,才能所有相似的集合對,復雜度仍然是O(n2)。所以,接下來描述解決這個問題的核心思想LSH。其基本思路是將相似的集合聚集到一起,減小查找范圍,避免比較不相似的集合。仍然是從例子開始,現在有5個集合,計算出對應的Minhash摘要,如下:

?

?

?

S1

S2

S3

S4

S5

區間1

b

b

a

b

a

c

c

a

c

b

d

b

a

d

c

區間2

a

e

b

e

d

b

d

c

f

e

e

a

d

g

a

區間3

d

c

a

h

b

a

a

b

b

a

d

e

a

b

e

區間4

d

a

a

c

b

b

a

c

b

a

d

e

a

b

e

表5

上面的集合摘要采用了12個不同的hash函數計算出來,然后分成了B = 4個區間。前面已經分析過,任意兩個集合(S1,S2)對應的Minhash值相等的概率r = Jac(S1,S2)。先分析區間1,在這個區間內,P(集合S1等于集合S2) = r3。所以只要S-1和S2的Jaccard相似度越高,在區間1內越有可能完成全一致,反過來也一樣。那么P(集合S1不等于集合S2) = 1 - r3。現在有4個區間,其他區間與第一個相同,所以P(4個區間上,集合S1都不等于集合S2) = (1 – r3)4。P(4個區間上,至少有一個區間,集合S1等于集合S2) = 1 - (1 – r3)4。這里的概率是一個r的函數,形狀猶如一個S型,如下:

?

?

圖1

如果令區間個數為B,每個區間內的行數為C,那么上面的公式可以形式的表示為:

P(B個區間中至少有一個區間中兩個結合相等) = 1 - (1 – rC)B

領r = 0.4,C=3,B = 100。上述公式計算的概率為0.9986585。這表明兩個Jaccard相似度為0.4的集合在至少一個區間內沖撞的概率達到了99.9%。根據這一事實,我們只需要選取合適的B和C,和一個沖撞率很低的hash函數,就可以將相似的集合至少在一個區間內沖撞,這樣也就達成了本節最開始的目的:將相似的集合放到一起。具體的方法是為B個區間,準備B個hash表,和區間編號一一對應,然后用hash函數將每個區間的部分集合映射到對應hash表里。最后遍歷所有的hash表,將沖撞的集合作為候選對象進行比較,找出相識的集合對。整個過程是采用O(n)的時間復雜度,因為B和C均是常量。由于聚到一起的集合相比于整體比較少,所以在這小范圍內互相比較的時間開銷也可以計算為常量,那么總體的計算時間也是O(n)。

?

經驗之談:

minHash算法只適合較細粒度的聚類,太粗的話不好弄

?

參考:

[1]???????書籍《Mining of Massive Datasets》的第三章Find Similar Item,由Anand Rajaraman,Jure Leskovec和Jeffrey David Ullman著

[2] ? ? ??http://www.cnblogs.com/bourneli/archive/2013/04/04/2999767.html

轉載于:https://www.cnblogs.com/AngelaSunny/p/6221813.html

總結

以上是生活随笔為你收集整理的海量数据集利用Minhash寻找相似的集合【推荐优化】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。