我正在使用基于项目的CF,它使用调整后的余弦相似度。我最近添加了一个正则余弦相似度,我得到了完全不同的结果。现在我的问题是哪个更适合考虑我的数据?
这是用户,项目和评级的可能方案
User 1 | User 2 | User 3 | User 4 | User 5
Item 1 | 5 | 1 | 1 | 5 | 5
Item 2 | 5 | 1 | 2 | 4 | 5
Item 3 | 1 | 5 | 4 | 2 | 3
考虑到这些数据,您可以得出结论,第1项和第2项相对“相似”。以下是不同相似系数的结果:
第1项和第2项之间的相似性
Adjusted cosine similarity = 0.865
Regular cosine similarity = 0.987
我为这个例子取消了它们
您可以看到这基本相同,但是当您尝试计算第2项和第3项之间的相似性时(它们根本不相似)会导致完全不同的结果:
第2项和第3项之间的相似性
Adjusted cosine similarity = -0.955
Regular cosine similarity = 0.656
我为这个例子取消了它们
其中哪些会更好?&#39 ;?我假设使用调整后的余弦相似性更好,因为它考虑了用户的平均评级,但为什么常规余弦相似性会导致这种“不同”的正数。项目?我是否应该仅仅避免使用常规余弦相似度或仅针对某些情况?
任何帮助将不胜感激!
答案 0 :(得分:2)
为什么常规余弦相似性会导致这些“不同”项目的正数?
正如您在示例中已经提到的,Adjusted Cosine Similarity
在某些情况下比Regular Cosine Similarity
更好地反映了差异。
Regular Cosine Similarity
反映了方向的差异,但不反映了位置。
dist(A,B)
是A和B之间的Euclidean Distance
。很明显,如果任何向量沿着自己的方向延伸,则余弦相似性将保持不变。
让我们假设用户在两部电影中给出0~5分。
from scipy import spatial
import numpy as np
a = np.array([2.0,1.0])
b = np.array([5.0,3.0])
1 - spatial.distance.cosine(a,b)
#----------------------
# 0.99705448550158149
#----------------------
c = np.array([5.0,4.0])
1 - spatial.distance.cosine(c,b)
#----------------------
# 0.99099243041032326
#----------------------
直观地说,我们会说用户b
和c
有相似的品味,a
与他们完全不同。但是常规的余弦相似性告诉我们一个错误的故事。
让我们计算Adjusted Cosine Similarity
,首先减去x
和y
mean_ab = sum(sum(a,b)) / 4
# mean_ab : 3.5
# adjusted vectors : [-1.5, -2.5] , [1.5, -0.5]
1 - spatial.distance.cosine(a - mean_ab, b - mean_ab)
#----------------------
# -0.21693045781865616
#----------------------
mean_cb = sum(sum(c,b)) / 4
# mean_cb : 6.5
# adjusted vectors : [-1.5, -3.5] , [-1.5, -2.5]
1 - spatial.distance.cosine(c - mean_cb, b - mean_cb)
#----------------------
# 0.99083016804429891
#----------------------
很明显,调整是有意义的。
我是否应该仅仅避免使用常规余弦相似度或仅针对某些情况?
当您发现问题时,请使用合适的问题。
我仍然认为常规余弦相似性在我们希望对矢量规模的灵敏度较低的情况下很有用。例如,如果得分[2,1]被认为与[4,2]或[8,4]非常相似,那么常规将做得很好。