關於相似度計算的算法總結


相似度計算

1         相似度的計算簡介

    關於相似度的計算,現有的幾種基本方法都是基於向量(Vector)的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦的場景中,在用戶-物品偏好的二維矩陣中,我們可以將一個用戶對所有物品的偏好作為一個向量來計算用戶之間的相似度,或者將所有用戶對某個物品的偏好作為一個向量來計算物品 之間的相似度。下面我們詳細介紹幾種常用的相似度計算方法:

1.1        皮爾遜相關系數(Pearson Correlation Coefficient)(百度用來判斷tiele相似度的算法之一)

皮爾遜相關系數一般用於計算兩個定距變量間聯系的緊密程度,它的取值在 [-1,+1] 之間。

                                              

sx, sy是 x 和 y 的樣品標准偏差。

類名:PearsonCorrelationSimilarity

原理:用來反映兩個變量線性相關程度的統計量

范圍:[-1,1],絕對值越大,說明相關性越強,負相關對於推薦的意義小。

說明:1、 不考慮重疊的數量;2、 如果只有一項重疊,無法計算相似性(計算過程被除數有n-1);3、 如果重疊的值都相等,也無法計算相似性(標准差為0,做除數)。

該相似度並不是最好的選擇,也不是最壞的選擇,只是因為其容易理解,在早期研究中經常被提起。使用Pearson線性相關系數必須假設數據是成對地從正態分布中取得的,並且數據至少在邏輯范疇內必須是等間距的數據。Mahout中,為皮爾森相關計算提供了一個擴展,通過增加一個枚舉類型(Weighting)的參數來使得重疊數也成為計算相似度的影響因子。

1.2        歐幾里德距離(Euclidean Distance)

最初用於計算歐幾里德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾里德距離是:

 

可以看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。當用歐幾里德距離表示相似度,一般采用以下公式進行轉換:距離越小,相似度越大。

 

類名:EuclideanDistanceSimilarity

原理:利用歐式距離d定義的相似度s,s=1 / (1+d)。

范圍:[0,1],值越大,說明d越小,也就是距離越近,則相似度越大。

說明:同皮爾森相似度一樣,該相似度也沒有考慮重疊數對結果的影響,同樣地,Mahout通過增加一個枚舉類型(Weighting)的參數來使得重疊數也成為計算相似度的影響因子。

1.3     Cosine 相似度(Cosine Similarity)

Cosine 相似度被廣泛應用於計算文檔數據的相似度:

 

類名: UncenteredCosineSimilarity

原理:多維空間兩點與所設定的點形成夾角的余弦值。

范圍:[-1,1],值越大,說明夾角越大,兩點相距就越遠,相似度就越小。

說明:在數學表達中,如果對兩個項的屬性進行了數據中心化,計算出來的余弦相似度和皮爾森相似度是一樣的,在mahout中,實現了數據中心化的過程,所以皮爾森相似度值也是數據中心化后的余弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity類作為計算非中心化數據的余弦相似度。

 

1.4     Spearman秩相關系數--Spearman Correlation

類名:SpearmanCorrelationSimilarity

原理:Spearman秩相關系數通常被認為是排列后的變量之間的Pearson線性相關系數。

范圍:{-1.0,1.0},當一致時為1.0,不一致時為-1.0。

說明:計算非常慢,有大量排序。針對推薦系統中的數據集來講,用Spearman秩相關系數作為相似度量是不合適的。

1.5     Tanimoto 系數(Tanimoto Coefficient)

Tanimoto 系數也稱為 Jaccard 系數,是 Cosine 相似度的擴展,也多用於計算文檔數據的相似度:

 

類名:TanimotoCoefficientSimilarity

原理:又名廣義Jaccard系數,是對Jaccard系數的擴展,等式為

范圍:[0,1],完全重疊時為1,無重疊項時為0,越接近1說明越相似。

說明:處理無打分的偏好數據。

 

1.6     對數似然相似度

類名:LogLikelihoodSimilarity

原理:重疊的個數,不重疊的個數,都沒有的個數

說明:處理無打分的偏好數據,比Tanimoto系數的計算方法更為智能。

 

1.7     曼哈頓距離

類名:CityBlockSimilarity

原理:曼哈頓距離的實現,同歐式距離相似,都是用於多維數據空間距離的測度

范圍:[0,1],同歐式距離一致,值越小,說明距離值越大,相似度越大。

說明:比歐式距離計算量少,性能相對高。

 

2         各相似度計算方法優缺點分析

2.1     基於皮爾森相關性的相似度— Pearson correlation-based similarity

皮爾森相關系數反應了兩個變量之間的線性相關程度,它的取值在[-1, 1]之間。當兩個變量的線性關系增強時,相關系數趨於1或-1;當一個變量增大,另一個變量也增大時,表明它們之間是正相關的,相關系數大於0;如果一個變量增大,另一個變量卻減小,表明它們之間是負相關的,相關系數小於0;如果相關系數等於0,表明它們之間不存在線性相關關系。用數學公式表示,皮爾森相關系數等於兩個變量的協方差除於兩個變量的標准差。

 

 

協方差(Covariance):在概率論和統計學中用於衡量兩個變量的總體誤差。如果兩個變量的變化趨於一致,也就是說如果其中一個大於自身的期望值,另一個也大於自身的期望值,那么兩個變量之間的協方差就是正值;如果兩個變量的變化趨勢相反,則協方差為負值。其中u表示X的期望E(X), v表示Y的期望E(Y)。

 

標准差(Standard Deviation):

 

方差(Variance)在概率論和統計學中,一個隨機變量的方差表述的是它的離散程度,也就是該變量與期望值的距離

 

即方差等於誤差的平方和的期望,基於皮爾森相關系數的相似度有兩個缺點

(1) 沒有考慮用戶間重疊的評分項數量對相似度的影響;

(2) 如果兩個用戶之間只有一個共同的評分項,相似度也不能被計算。

 

上表中,行表示用戶(1~5)對項目(101~103)的一些評分值。直觀來看,User1和User5用3個共同的評分項,並且給出的評分值差也不大,按理他們之間的相似度應該比User1和User4之間的相似度要高,可是User1和User4有一個更高的相似度1。

例子:同樣的場景在現實生活中也經常發生,比如兩個用戶共同觀看了200部電影,雖然不一定給出相同或完全相近的評分,他們之間的相似度也應該比另一位只觀看了2部相同電影的相似度高吧!但事實並不如此,如果對這兩部電影,兩個用戶給出的相似度相同或很相近,通過皮爾森相關性計算出的相似度會明顯大於觀看了相同的200部電影的用戶之間的相似度。

Mahout對基於皮爾森相關系數的相似度給出了實現,它依賴一個DataModel作為輸入。

 

同時,Mahout還針對缺點(1)進行了優化,只需要在構造PearsonCorrelationSimilarity時多傳入一個Weighting.WEIGHTED參數,就能使有更多相同評分項目的用戶之間的相似度更趨近於1或-1。

 

[java] :

  1. UserSimilarity similarity1 = new PearsonCorrelationSimilarity(model); 
  2. double value1 = similarity1.userSimilarity(1, 4);

3.    double value2= similarity1.userSimilarity(1, 5); 

4.    UserSimilarity similarity2 = new PearsonCorrelationSimilarity(model, Weighting.WEIGHTED); 

5.  double value3 = similarity1.userSimilarity(1, 4);

6.    double value4 = similarity2.userSimilarity(1, 5); 

結果:

Similarity of User1 and User4:0.9999999999999998

Similarity of User1 and User5: 0.944911182523068

Similarity of User1 and User4 with weighting: 0.9999999999999999

Similarity of User1 and User5 with weighting: 0.986227795630767

 

2.2     基於歐幾里德距離的相似度 —— Euclidean Distance-based Similarity

歐幾里德距離計算相似度是所有相似度計算里面最簡單、最易理解的方法。它以經過人們一致評價的物品為坐標軸,然后將參與評價的人繪制到坐標系上,並計算他們彼此之間的直線距離。

 

 

圖中用戶A和用戶B分別對項目X、Y進行了評分。用戶A對項目X的評分為1.8,對項目Y的評分為4,表示到坐標系中為坐標點A(1.8, 4);同樣用戶B對項目X、Y的評分表示為坐標點B(4.5, 2.5),因此他們之間的歐幾里德距離(直線距離)為:

 

計算出來的歐幾里德距離是一個大於0的數,為了使其更能體現用戶之間的相似度,可以把它規約到(0, 1]之間,具體做法為:1 / (1 + d)。參見上表。

 

只要至少有一個共同評分項,就能用歐幾里德距離計算相似度;如果沒有共同評分項,那么歐幾里德距離也就失去了作用。其實照常理理解,如果沒有共同評分項,那么意味着這兩個用戶或物品根本不相似。

 

2.3     余弦相似度 —— Cosine Similarity

余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。

 

與歐幾里德距離類似,基於余弦相似度的計算方法也是把用戶的喜好作為n-維坐標系中的一個點,通過連接這個點與坐標系的原點構成一條直線(向量),兩個用戶之間的相似度值就是兩條直線(向量)間夾角的余弦值。因為連接代表用戶評分的點與原點的直線都會相交於原點,夾角越小代表兩個用戶越相似,夾角越大代表兩個用戶的相似度越小。同時在三角系數中,角的余弦值是在[-1, 1]之間的,0度角的余弦值是1,180角的余弦值是-1。借助三維坐標系來看下歐氏距離和余弦相似度的區別:

 

從圖上可以看出距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置坐標(即個體特征維度的數值)直接相關;而余弦相似度衡量的是空間向量的夾角,更加的是體現在方向上的差異,而不是位置。如果保持A點的位置不變,B點朝原方向遠離坐標軸原點,那么這個時候余弦相似度cos是保持不變的,因為夾角不變,而A、B兩點的距離顯然在發生改變,這就是歐氏距離和余弦相似度的不同之處。

余弦相似度的特點:

  1. 對用戶的絕對的數值不敏感
  2. 計算時不考慮用戶之間的共同評分項數量,即使僅僅有極少相同評分項,也有可能獲得很大的相似度結果,例如上表中的uer3與user1.
  3. 只要各個評分項之間越趨向於對應成比例,而不論數值差異如何,則相似度越趨近於1.000.

根據歐氏距離和余弦相似度各自的計算方式和衡量特征,分別適用於不同的數據分析模型:歐氏距離能夠體現個體數值特征的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用用戶行為指標分析用戶價值的相似度或差異;而余弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用用戶對內容評分來區分用興趣的相似度和差異,同時修正了用戶間可能存在的度量標准不統一的問題(因為余弦相似度對絕對數值不敏感)。

注:

根據以上的分析,余弦相似度更適合於這樣一類數據的挖掘工作:

  1. 計算結果對用戶數據絕對值不敏感,例如在描述用戶的興趣、喜好、或用於情感分析時。
  2. 用戶數據中的評分值其實是用戶主觀的評分結果,換言之,每個用戶的評價標准是不一致的,有一些對於“好的”界定標准更為苛刻,而另一些則對於“好”、“不好”的界定則更為寬容。這種情況下,用余弦相似度來計算用戶之間的相似度或差異,可以弱化度量標准不統一這一因素。Eg:

模糊度量標准

“很不好”

“不好”

“較好”

“很好”

User1的評價標准

1.0

2.0

3.5

4.0

User2的評價標准

2.0

3.0

4.0

5.0

User3的評價標准

1.0

2.0

3.0

4.0

上表中user1和user3的評價標准很相似,都是較為“苛刻的”,user2,相比之下顯得更為“寬容”。

Item

Item001

Item002

Item003

User1的評價

2.0

4.0

3.5

User2的評價

3.5

5.0

4.5

User3的評價

2.0

3.5

4.0

從數值上看,顯然user1和user3的評分值更為接近,似乎相似度更高;而user2的評分值相較user1差異較大。

    [java]:

1. UserSimilarity similarity1 = new UncenteredCosineSimilarity (model); 

2. double value1 = similarity1.userSimilarity(1, 2);

3. double value2= similarity1.userSimilarity(1, 3);

4.UserSimilarity similarity2= new EuclideanDistanceSimilarity (model); 

5. double value3 = similarity2.userSimilarity(1, 2);

6. double value4= similarity2.userSimilarity(1, 3);

 

計算結果:

Similarity of User1 and User2 using cos: 0.9927441515592047

Similarity of User1 and User3 using cos: 0.9801293311529091

Similarity of User1 and User2 using Euc:0.45657137141714005

 

Similarity of User1 and User3 using Euc:0.4721359549995794

但是,余弦相似度的計算則揭示了

User2 與user1之間的相似度  > User3與user1之間的相似度。但如果用歐氏距離想速度則:User2 與user1之間的相似度  <  User3與user1。

 

2.4     調整余弦相似度 —— Adjusted Cosine Similarity

在余弦相似度的介紹中說到:余弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感。因此沒法衡量每個維數值的差異,會導致這樣一個情況:比如用戶對內容評分,5分制,X和Y兩個用戶對兩個內容的評分分別為(1,2)和(4,5),使用余弦相似度得出的結果是0.98,兩者極為相似,但從評分上看X似乎不喜歡這兩個內容,而Y比較喜歡,余弦相似度對數值的不敏感導致了結果的誤差,需要修正這種不合理性,就出現了調整余弦相似度,即所有維度上的數值都減去一個均值,比如X和Y的評分均值都是3,那么調整后為(-2,-1)和(1,2),再用余弦相似度計算,得到-0.8,相似度為負值並且差異不小,但顯然更加符合現實。

 

2.5     斯皮爾曼相關 —— Spearman Correlation

斯皮爾曼相關性可以理解為是排列后(Rank)用戶喜好值之間的Pearson相關度。《Mahout in Action》中有這樣的解釋:假設對於每個用戶,我們找到他最不喜歡的物品,重寫他的評分值為“1”;然后找到下一個最不喜歡的物品,重寫評分值為“2”,依此類推。然后我們對這些轉換后的值求Pearson相關系數,這就是Spearman相關系數。

斯皮爾曼相關度的計算舍棄了一些重要信息,即真實的評分值。但它保留了用戶喜好值的本質特性——排序(ordering),它是建立在排序(或等級,Rank)的基礎上計算的。回顧前面表中User1~5對Item101~103的喜好(評分)值,通過斯皮爾曼相關系數計算出的相似度為:

 

我們發現,計算出來的相似度值要么是1,要么是-1,因為這依賴於用戶的喜好值和User1的喜好值是否趨於“一致變化”還是呈“相反趨勢變化"。Mahout對斯皮爾曼相關系數給出了實現,具體可參考SpearmanCorrelationSimilarity,它的執行效率不是非常高,因為斯皮爾曼相關性的計算需要花時間計算並存儲喜好值的一個排序(Ranks),具體時間取決於數據的數量級大小。正因為這樣,斯皮爾曼相關系數一般用於學術研究或者是小規模的計算。

 

[java] :

UserSimilarity similarity1 = new SpearmanCorrelationSimilarity(model);

// construct a Spearman Correlation-based Similarity 

結果:

User1 to User1 : 1.0

User2 to User1 : -1.0

User3 to User1 : NaN

User4 to User1 : 1.0

User4 to User1 : 1.0

考慮到Spearman Correlation的效率,可以把SpearmanCorrelationSimilarity包裝一層Cache,具體做法為:

[java]:

UserSimilarity similarity2 = new CachingUserSimilarity (new SpearmanCorrelationSimilarity (model), model); 

這樣,每次計算的結果會直接放入Cache,下一次計算的時候可以立即得到結果,而不是重新再計算一次。

Spearman相關系數的特點:

  1. Spearman相關是根據等級資料研究兩個變量間相關關系的方法。它是依據兩列成對等級的各對等級數之差來進行計算的,所以又稱為“等級差數法”
  2. Spearman相關系數對原始變量的分布不做要求,屬於非參數統計方法。因此它的適用范圍比Pearson相關系數要廣的多。即使原始數據是等級資料也可以計算Spearman相關系數。對於服從Pearson相關系數的數據也可以計算Spearman相關系數,
  3. 統計效能比Pearson相關系數要低一些(不容易檢測出兩者事實上存在的相關關系)。
  4. spearman只要兩個變量的觀測值是成對的等級評定資料,或者是由連續變量觀測資料轉化得到的等級資料,不論兩個變量的總體分布形態、樣本容量的大小如何,都可以用斯皮爾曼等級相關來進行研究。

注:spearman與pearson:

1.  連續數據,正態分布,線性關系,用pearson相關系數是最恰當,當然用spearman相關系數也可以,就是效率沒有pearson相關系數高。

2.  上述任一條件不滿足,就用spearman相關系數,不能用pearson相關系數。

3.  兩個定序測量數據之間也用spearman相關系數,不能用pearson相關系數。

4 .只要在X和Y具有單調的函數關系的關系,那么X和Y就是完全Spearman相關的,這與Pearson相關性不同,后者只有在變量之間具有線性關系時才是完全相關的。

 

6. 基於谷本系數的相似性度量 —— Tanimoto Coefficient-based Similarity

Tanimoto Coefficient和前面的5中相關度計算方式有很大的不同,它不關心用戶對物品的具體評分值是多少,它關心用戶與物品之間是否存在關聯關系。Tanimoto Coefficient依賴於用戶和物品之間的這種Boolean關系作為輸入。更准確的說法為:Tanimoto Coefficient主要用於計算符號度量或布爾值度量的個體間的相似度,因為個體的特征屬性都是由符號度量或者布爾值標識,因此無法衡量差異具體值的大小,只能獲得“是否相同”這個結果,所以Tanimoto Coefficient只關心個體間共同具有的特征是否一致這個問題。Tanimoto Coefficient又被叫做Jaccard Coefficient,其值等於兩個用戶共同關聯(不管喜歡還是不喜歡)的物品數量除於兩個用戶分別關聯的所有物品數量。

 

也就是關聯的交集除於關聯的並集,用公式表示為:

 

其值介於[0, 1]之間,如果兩個用戶關聯的物品完全相同,交集等於並集,值為1;如果沒有任何關聯,交集為空,值為0。

注:本塊中說到的關聯指用戶對物品有評分值。

 

轉自:https://www.tuiedu.org/74.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM