Mining Massive Datasets課程筆記(二)

Finding Similar Sets

在數據挖掘中有一個很基礎的問題就是尋找相似項。比如“查找具有相似愛好的用戶“等應用的本質就是查找相似項。
這一節介紹的就是如何尋找相似項。採用的相似度衡量概念爲“Jaccard 相似度”,具體的意思在後文介紹,其主要思想就是兩個集合的交集所佔的比例越大則認爲兩者越相似。
對於數據量非常龐大的情況來講逐一計算相似度肯定是不現實的,聯繫hash表的(可以快速尋找到特定元素而不用搜尋所有元素)的特性,首先使用Shingling算法,然後提出MinHashing來compress large sets以及
locality-sensitive Hashing 來 find similar documents or similar sets without doing anything that involves searching all pairs.

Applications of Set-Similarity

  • 尋找相似主題或相似內容的網頁
  • 推薦系統:對同一用戶按口味推薦可能喜歡的電影
  • 尋找有相似受衆的電影
  • 實體解析

Similar Documents

以尋找具有相似的text or words的文檔爲例(不是相似topic),這一例子有很多現實應用:
- 尋找鏡像網頁,從而避免在搜索結果中重複出現
- 找到抄襲頁面,包括只是大量引用且有改動的情況
- 將描寫相同事件的網頁聚在一起,呈現在結果頁面
這些例子中雖然各個頁面的內容大部分是一致的,但是各自有各自的改動或特點,比如同一新聞在不同新聞網站上logo、link甚至標題都會有輕微不同,單純進行逐個單詞的比較來計算相似肯定是不對的。

對於處理相似文本,我們需要三種技術:
這裏寫圖片描述
1. Shingling:Jaccard相似度需要計算集合的交集,因此需要將文檔轉換爲集合形式,這一步稱爲Shingling;
2. Minhashing:將上一步得到的sets轉變爲一些短的signatures同時保留sets之間的相似度;
3. Locality-sensitive Hashing:我們知道即使文本的數量只是million級的,要計算signatures間的相似度則有trillion級別的pairs要計算,而LSH可以實現只計算部分相似度很高的signature pairs就可以幾乎得到所有的相似項。

這是整體的流程圖:
這裏寫圖片描述
下面我們分別講解這三個步驟的實現方式

Shingles

把相鄰的k個字符作爲一個元素,從而將整篇文檔變爲一個集合,通常將k值設在5~10之間。對於K值的選擇依賴於文檔的長度以及文檔中詞語的評價長度,最好保證任一shingle在文檔中所佔的比例都很小。
這裏寫圖片描述

Shingles and Similarity
這裏寫圖片描述

shingles:Compress Option
這裏寫圖片描述

Minhashing

Jaccard similarity Measure

這裏寫圖片描述
Example:
這裏寫圖片描述
From Sets to Boolean M atrix
這裏寫圖片描述

通常我們需要處理大型的集合,因此使用矩陣形式是很有用的,首先我們將集合表示爲一個單一的布爾型矩陣,即使該集合的存儲方式不是布爾型:
我們首先建一個全集,使之包含所有的集合元素,例如,對一個k-shingles表示的文檔,它的全集就是由k個character組成的所有序列或者是所有tokens(如果採用了hash處理shingles的話)
特徵矩陣表示:
矩陣的行就是所有的這些序列,矩陣的列就是一個集合的向量表示,只有當結合S(假設第j列)中包含k-shingles元素E(假設在第i行)時,矩陣中的元素M(i,j)纔等於1,否則記爲0。因此列向量中只有值爲1的元素才屬於集合中的元素,在計算兩個列向量的Jaccard相似度時,需要注意只有同時爲1才表示集合相交,也只有值爲1對應的元素才屬於集合中。
Example:
這裏寫圖片描述
因此,一般我們可以通過計算兩列中同爲1的元素個數/兩列中至少有一列有的元素個數來得到Jaccard相似度

注意:上文提到的矩陣在實際應用中是非常稀疏的,並不像例子中舉得規模那麼小且不稀疏。因爲一篇文檔中存在的shingles再所有k個元素組成的可能序列中所佔的比例非常小,如k=10時由26個字母組成的shingles可以有2610=1.4e14 個,而文檔中實際並不會有那麼多shingles.
再比如如果矩陣的行表示亞馬遜上的不同圖書,列表示不同用戶的購買記錄,單個用戶所購買的書再多,和亞馬遜上所有的圖書數目相比仍然很小。

不要忘了我們的目標是描述如何 通過由minhashing得到的signatures 來推斷sets或矩陣的列之間的相似度的。

首先我們來看兩個列的相同行可能存在的四種情況:
這裏寫圖片描述
因此Jaccard相似度就可以通過a、b、c來表示。

接下來我們定義Minhashing:
這裏寫圖片描述

假設特徵矩陣的行被隨機排列,任何一列的minhash值是根據rows新的排列次序下,該列中數字第一行是1的行號。 通常使用如100個獨立的hash 函數來爲每一列構建簽名(signatures),從而形成有邊的signature matrix,行表示Minhash的值,列表示集合。
Example:
這裏寫圖片描述

那麼爲什麼要定義Minhashing以及它和我們要求的Jaccard相似度間的有啥關係呢?
在等概率隨機全排列的行中,兩個集合(列)的minhash值相等的概率和兩個集合的Jaccard相似度相等。 都是a/(a+b+c)
證明:如果我們限制於集合s1和s2,那麼行可以分成三類:
1.類型X 兩列值都是1
2.類型Y 一列是1,另一列是0
3.類型Z 兩列都是0
由於矩陣是稀疏的,所以大多數的行是類型Z。類型X和類型Y的函數既決定了SIM(S1,S2) 又決定了h(s1)=h(s2).我們假設有x行是類型X的,y行是類型y的。那麼SIM(S1,S2) = x/(x+y).因爲x是S1 ∩ S2的大小,而x + y是S1 ∪ S2大小.
現在我們考慮h(s1) = h(s2)的概率。如果我們假設我們隨機排列行,那麼我們從上到下, 在遇到類型Y之前遇到類型X的概率是x/(x+y)。如果我們從上往下遇到的除了Z類型的第一行 是X類型的行,那麼h(s1) = h(s2).
另一方面,如果除了類型Z,我們第一次遇到的類型是類型Y,那麼是1的集合,其對應行數,就是minhash值。是0的集合仍然需要向下才能找到爲1的行,因此如果我們第一次遇到的是類型Y那麼h(s1) <> h(s2)。所以h(s1) = h(s2)的概率是 x / (x + y),這也是s1和s2的Jaccard相似度。

在全排列的情況下兩者值是相等的,但是前面說過特徵矩陣非常稀疏,爲了代表這些集合,我們從M行的排列中選擇n個 ,可能是100或者幾百個排列。有這些排列組成了minhash函數h1,h2,…,hn。 從由列表示的集合S,構建其minhash簽名。矩陣M的第i個列被第i列的minhash簽名所代替。
這個簽名矩陣具有和原來矩陣一樣的列M,但是隻有n行,因此由Minhashing生成的signature matrix的行數往往遠小於原來的矩陣,從而實現特徵矩陣的壓縮,因此signture matrix 計算的得到的相似度與Jaccard相似度會有些偏差。

Similarity for Signatures

可以用上面得到的矩陣簽名的相似度來近似得到Jaccard相似度,集合的signatures越長即行數越大,誤差就越小。全排列時等於Jaccard相似度。

Implementation of Minhashing

我們知道前面的Minhashing是建立在行的全排列上的,但是對於大規模的數據形成的特徵矩陣而言,如十億行,如果要挑選是一行的一個random permutation是很耗費時間和空間的。
解決方式:
通過一個隨機hash函數將行號和具有和行數相同的桶進行映射,從而模擬隨機排列。
一個hash函數將0…k-1的數字映射到0…k-1的桶中,典型的可能出現不同的數字會映射到相同的桶中,然後其他的一些桶沒有被映射。然而只要k足夠大,並且沒有太多的衝突,這個不同是不重要得,我們可以維護一個hash函數h,將行r映射到h(r)的位置上。 將這個映射看成是隨機排列的模擬。
具體過程:
這裏寫圖片描述

  1. 計算h1(r), h2(r), …hn(r), 設置初始sig(i,c)=
  2. 對於所有的列c:
    (a). 如果(r, c) = 0 不作任何操作
    (b). 如果(r, c) = 1, 那麼對於i = 1,2,…n, sig(i, c) = min( sig(i,c), hi(r) )

Example:
這裏寫圖片描述

Locality-Sensitive Hashing

小結下前面的知識,爲了計算文檔相似度,首先我們將文檔按k-shingles劃分形成將documents轉換爲sets,然後利用Minhashing將shingle特徵矩陣轉換爲signature matrix,這一步能有效地壓縮數據,然後我們可以通過比較signature得到近似的Jaccard相似度。

雖然signature有效壓縮了數據,但是要計算相似度還是需要對列向量兩兩對比計算,當文檔很多時仍然很低效,假設有一個相關度閾值T,我們其實只需要計算那些相似度可能大於T的pairs就好,而不需要計算所有pairs。這一點可以通過locality-sensitive Hashing或者near-neighbor search實現。
locality-sensitive Hashing就是在這一系列signature中選擇候選的pairs,而不需要計算所有的Elements就能得到相似文檔。

When constructing candidate pairs,you look only at individual elements,not at the pairs themselves.

下面我們看下對於signature matrix,是如何挑選候選pairs的:
這裏寫圖片描述

LSH for Minhashing Signatures

一個最簡單直接的方法就是對signature matrix M的各列進行多次哈希,相似的列更可能會被hash到相同的bucket,因此Candidate pairs就是那些至少又一次被hash到同一個bucket的列。
這裏寫圖片描述
如圖,將一個signature matrix M的rows劃分爲b個bands,每個band有r行,則b*r = len(rows of M) = the number of minhashing functions that used to create signature matrix
然後,對於每個band,將列元素中對應這一band的部分哈希到k個buckets中,這個k值應該儘可能大(減少哈希過程中的衝突數,保證分到同一個bucket的原因是因爲對應band中的元素很相似)
Example:
這裏寫圖片描述
我們認爲至少被分到同一個buckets中一次的列是candidate pairs。通過調整b和r的大小來獲取儘可能多的相似對,儘量少的nonsimilar pairs。從直觀的角度看,我們不難理解,b越大r越小時,分到同一個buckets的概率越大,適用於similarity閾值小時;反之b越小r越大,越難有同一個buckets的pairs,適用於similarity閾值大時。

Analysis of LSH——What We What

Ref
https://class.coursera.org/mmds-003/lecture
http://blog.csdn.net/sherrylml

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