2017-03-17 174 views
2

我碰到這個公式閱讀並傳來:餘弦相似度

enter image description here

的公式是餘弦相似性。我認爲這看起來很有趣,我創建了一個numpy數組,其user_id作爲row和item_id作爲列。例如,讓M是這個矩陣:

M = [[2,3,4,1,0],[0,0,0,0,5],[5,4,3,0,0],[1,1,1,1,1]] 

這裏矩陣內的條目是收視率的人u基於u行和列i已經給項目i。我想爲這個矩陣之間的項(行)計算餘弦相似度。這應該產生一個5×5矩陣,我相信。我試圖做

df = pd.DataFrame(M) 
item_mean_subtracted = df.sub(df.mean(axis=0), axis=1) 
similarity_matrix = item_mean_subtracted.fillna(0).corr(method="pearson").values 

然而,這似乎並不正確。

回答

3

這裏是一個可能實現的調整餘弦相似性:

import numpy as np 
from scipy.spatial.distance import pdist, squareform 

M = np.asarray([[2, 3, 4, 1, 0], 
       [0, 0, 0, 0, 5], 
       [5, 4, 3, 0, 0], 
       [1, 1, 1, 1, 1]]) 

M_u = M.mean(axis=1) 
item_mean_subtracted = M - M_u[:, None] 
similarity_matrix = 1 - squareform(pdist(item_mean_subtracted.T, 'cosine')) 

備註:

  • 我正在與NumPy broadcasting的優勢,減去平均。
  • 如果M是一個稀疏矩陣,你可以不喜歡的部份:M.toarray()
  • docs

    Y = pdist(X, '餘弦')
    計算向量u和v之間的餘弦距離,
    1 - u⋅v/(|| ||ü2 || v || 2
    其中|| * || 是它的參數*的2範數,並且u⋅v爲u的點積,並通過T方法進行訴

  • 陣列換位。

演示:

In [277]: M_u 
Out[277]: array([ 2. , 1. , 2.4, 1. ]) 

In [278]: item_mean_subtracted 
Out[278]: 
array([[ 0. , 1. , 2. , -1. , -2. ], 
     [-1. , -1. , -1. , -1. , 4. ], 
     [ 2.6, 1.6, 0.6, -2.4, -2.4], 
     [ 0. , 0. , 0. , 0. , 0. ]]) 

In [279]: np.set_printoptions(precision=2) 

In [280]: similarity_matrix 
Out[280]: 
array([[ 1. , 0.87, 0.4 , -0.68, -0.72], 
     [ 0.87, 1. , 0.8 , -0.65, -0.91], 
     [ 0.4 , 0.8 , 1. , -0.38, -0.8 ], 
     [-0.68, -0.65, -0.38, 1. , 0.27], 
     [-0.72, -0.91, -0.8 , 0.27, 1. ]]) 
+0

我相信調整餘弦相似值應爲-1到1之間的權利? –

+0

是的,絕對。我誤解了公式。請再次看看我編輯的答案,我認爲現在調整後的餘弦相似度已正確實施。 – Tonechas

+0

執行此組U中的用戶對於u一樣的是,式請求? –