1. 程式人生 > >最近鄰和K近鄰及其優化演算法LSH(區域性敏感雜湊,Locality Sensitive Hashing) Kd-Tree

最近鄰和K近鄰及其優化演算法LSH(區域性敏感雜湊,Locality Sensitive Hashing) Kd-Tree

引言

在處理大量高維資料時,如何快速地找到最相似的資料是一個比較難的問題。如果是低維的小量資料,線性查詢(Linear Search)就可以解決,但面對海量的高維資料集如果採用線性查詢將會非常耗時。因此,為了解決該問題通常採用些優化演算法。稱之為近似最近鄰查詢(Approximate Nearest Neighbor),例如kd-tree with best bin first,locality sensitive hashing。最近鄰演算法思想很簡單:以整個訓練樣本作為代表點,計算未知樣本與所有訓練樣本的距離,並以最近鄰的類別作為決策未知樣本類別的唯一依據。但顯然以一個訓練樣本作為判斷標準,很容易受到噪聲點的影響。因此引出K近鄰,對與測試樣本最近的k(k一般奇數)個訓練樣本類別進行投票判斷測試樣本類別。

常用相似性度量

皮爾森相關度
原理:用來反映兩個變數線性相關程度的統計量
範圍:[-1,1],絕對值越大,說明相關性越強,負相關對於推薦的意義小。
說明:1、 不考慮重疊的數量;2、 如果只有一項重疊,無法計算相似性(計算過程被除數有n-1);3、 如果重疊的值都相等,也無法計算相似性(標準差為0,做除數)。

歐式距離相似度
原理:利用歐式距離d定義的相似度s,s=1 / (1+d)。
範圍:[0,1],值越大,說明d越小,也就是距離越近,則相似度越大。
說明:同皮爾森相似度一樣,該相似度也沒有考慮重疊數對結果的影響,同樣地,Mahout通過增加一個列舉型別(Weighting)的引數來使得重疊數也成為計算相似度的影響因子。

餘弦相似度
原理:多維空間兩點與所設定的點形成夾角的餘弦值。
範圍:[-1,1],值越大,說明夾角越大,兩點相距就越遠,相似度就越小。
說明:在數學表達中,如果對兩個項的屬性進行了資料中心化,計算出來的餘弦相似度和皮爾森相似度是一樣的,在mahout中,實現了資料中心化的過程,所以皮爾森相似度值也是資料中心化後的餘弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity類作為計算非中心化資料的餘弦相似度。

Spearman秩相關係數
原理:Spearman秩相關係數通常被認為是排列後的變數之間的Pearson線性相關係數。
範圍:{-1.0,1.0},當一致時為1.0,不一致時為-1.0。
說明:計算非常慢,有大量排序。針對推薦系統中的資料集來講,用Spearman秩相關係數作為相似度量是不合適的。

曼哈頓距離
原理:曼哈頓距離的實現,同歐式距離相似,都是用於多維資料空間距離的測度
範圍:[0,1],同歐式距離一致,值越小,說明距離值越大,相似度越大。
說明:比歐式距離計算量少,效能相對高。

Tanimoto係數
原理:又名廣義Jaccard係數,是對Jaccard係數的擴充套件,等式為
範圍:[0,1],完全重疊時為1,無重疊項時為0,越接近1說明越相似。
說明:處理無打分的偏好資料。

對數似然相似度
原理:重疊的個數,不重疊的個數,都沒有的個數
範圍:具體可去百度文庫中查詢論文《Accurate Methods for the Statistics of Surprise and Coincidence》
說明:處理無打分的偏好資料,比Tanimoto係數的計算方法更為智慧。

LSH區域性敏感雜湊

演算法流程如下:
這裡寫圖片描述
詳細可瞭解
LSH存在的問題是:如果資料稀疏(spread out)那麼表現很好,但如果資料稠密(clumpy data),就會導致許多資料點在同一個bucket裡面,而有些bucket裡面資料較少。

Kd-Tree

詳細可瞭解
對於Kd-tree標準演算法不好用於高維資料,因為需要太多backtracking。但是我們修剪至一定數量葉子,並且使用best bin first heuristic,那麼該演算法就較好適用於稠密資料(clumpy data)。