2017-03-17 152 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一样的是,式请求? –