基於map-reduce的相似度計算
不久前(6.29),參加了chinahadoop的夏季沙龍,聽了人人的大牛講了基於map-reduce的相似度計算的優化,感覺對map-reduce程式設計模型的理解又進一步加深了,在這裡把該演算法總結成博文,以期能夠更加透徹的理解該演算法。
相似度的計算在文字的分類、聚類、推薦系統、反作弊中應用廣泛。本文以文字的相似度計算為例,講述如何基於mr計算相似度。文字相似度的計算一般先使用vsm(向量空間模型)將文字表示成向量,向量的每個分量都代表某個詞語在文件中的權重,權重的計算可以用詞頻或者tf-idf等演算法得到。
從而,我們知道,對文字相似度計算有貢獻的是在兩個文字中同時出現過的詞語。
而乙個資料集的文字相似度計算問題是計算該資料集中每個文字對的相似度。同許多問題一樣,在文字數目比較小的時候,記憶體可以完全載入這些向量,可以很快的計算;但是當文字數目變大到一定程度,程式就會執行的很慢,一是因為記憶體不能裝載下,不停的記憶體換入換出十分耗時,二是因為該問題的時間複雜度是o(n3),n變大會導致程式的時間成立方級增長。
那麼如何使用map-reduce框架解決這個問題呢?
首先,問題的輸入可以看成乙個矩陣,如圖1[1]所示:
圖 1 文字-詞語矩陣或者使用者-特徵矩陣
其中,u代表文字,f代表詞語。如果直接以u為鍵進行map-reduce,那麼會遇到乙個問題,因為要計算資料集中所有的二元文字對的相似度,所以不得不將所有的資料發往每乙個節點,或者只有乙個reduce任務工作,以計算每個二元文字對的相似度。
所以,為了解決這個問題,我們將矩陣轉置,以f為鍵。這樣,解決該問題就由兩個map-reduce過程完成。第乙個mr過程稱為倒排索引,對每個文件,對其中的每個詞語,以詞語為鍵,文件標號與詞語在該文件中的權重為值輸出,這樣,我們就得到如(f4,[(u1,0.1),(u2,0.9),(u7,0.5)])格式的輸出。第二個mr過程計算文字相似度,以上乙個mr過程的輸出為輸入,在map過程中以文字對為鍵,以權重值的乘積為輸出,比如上面的f4輸出,map後變為[((u1,u2),0.09),((u1,u7),0.05),((u2,u7),0.45)],這樣,就得到了在所有的在兩個文字中共同出現的詞語針對該兩個文字的權重乘積;然後在reduce過程中將相同鍵的值相加,就得到了所有的二元文字對的文字相似度。完整的map-reduce樣例如圖2[2]所示:
圖 2 矩陣轉置後的map-reduce過程
經過這種設計之後,我們就可以使用map-reduce過程處理文字相似度問題了。
我們還可以通過stripe演算法
[3]來優化io,stripe演算法的詳細可以參考引申鏈結3,它與上圖方法的不同之處的根本在於輸出的表示形式,文字相似度問題的輸出是乙個對稱矩陣,而上圖中的輸出的表示方法是以二元對為鍵,以相似度為值,在stripe演算法中,輸出的表示則是以單個文件為鍵,以乙個關聯陣列為值,關聯陣列中的鍵為文件,值為關聯陣列中的鍵與輸出鍵對應的兩個文件的相似度,上圖的輸出使用stripe演算法的輸出表示為(d1,[(d2,1),(d3,4)]) ,(d2,[(d3,2)]),當然,根據輸出的形式,上圖中的pairwise similarity部分的map與shuffle的輸出都做出相應變化,據說,該演算法可以節省1/3的空間。
還能做的優化就是負載均衡方面的考慮了。利用貪婪演算法切分負載,對於任務佇列中的每乙個任務,將其放到負載最小的機器上面去。這種方法對資料實時切分,作為map的輸入。
還有一種優化是熱點消除,使用mirror mark演算法對比較大的任務進行切分,mirrormark演算法的基本思想是將所有的資料複製成多份到多台機器上,每台機器上只對一部分資料進行計算,mirror是指資料儲存多份,mark是指資料分配到機器前對要在該機器上計算的資料做標記,在機器上只計算標記的資料;mirror mark演算法能夠使執行時間最長的任務執行時間變短,從而降低整個map-reduce的時間。
實際上,對於文字-詞語矩陣或者使用者-特徵矩陣,計算相似度的問題其實可以看做是矩陣乘以矩陣的轉置的問題。圖2所示的mr過程實際上對矩陣的乘法做了兩個方面的優化,一是按照使用者對或者文字對進行分布式劃分,二是利用了矩陣的稀疏性,不計算特徵值為0的部分。
[1] **於講座的ppt
[2] 參考**:pairwise document similarity inlarge collections with mapreduce.
[3] stripe演算法具體可參見:
基於相似度的方法
異常 通常是乙個主觀的判斷,需要結合業務背景和環境來具體分析確定。雜訊和異常之間 正常資料和噪 聲之間的邊界都是模糊的。異常值通常具有更高的離群程度分數值,同時也更具有可解釋性。巢狀迴圈 第一層迴圈遍歷每個資料,第二層迴圈進行異常判斷,需要計算當前點與其他點的距離,一旦已識別出多於 個資料點與當前點...
余弦相似度及基於python的余弦相似度實現
余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。對於兩個向量,可以想象成空間中的兩條線段,都是從原點 0,0,出發,指向不同的方向。兩條線段之間形成乙個夾角 如果夾角為0度,則意味著方向相同 線段重合 如果夾角為90度,意味著形成直角,方向完全不相似 如果夾角為180...
基於詞頻的檔案相似度
基於詞頻的檔案相似度 實現一種簡單原始的檔案相似度計算,即以兩檔案的公共詞彙佔總詞彙的比 例來定義文章內容相似度。為簡化問題,這裡不考慮中文 因為分詞困難 只 考慮長度不小於 1000 個英文單詞的文章,長度超過 10 字母的單詞只考慮前 10 個字母。輸入 給出要檢查的英文文字檔案的資料夾位置 輸...