這裏是一個可能實現的調整餘弦相似性:
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. ]])
我相信調整餘弦相似值應爲-1到1之間的權利? –
是的,絕對。我誤解了公式。請再次看看我編輯的答案,我認爲現在調整後的餘弦相似度已正確實施。 – Tonechas
執行此組U中的用戶對於u一樣的是,式請求? –