调整余弦相似度与正余弦相似度之间的选择

Choice between an adjusted cosine similarity vs regular cosine similarity

我正在研究基于项目的 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 相对 'similar'。下面是不同相似度系数的结果:

项目 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
我为这个例子四舍五入了

其中哪些会是 'better'?我假设使用调整后的余弦相似度效果更好,因为它考虑了用户的平均评分,但为什么常规余弦相似度会导致此类 'different' 项目的正数?我应该避免在一般情况下或仅在某些情况下使用正则余弦相似度?

如有任何帮助,我们将不胜感激!

Why would a regular cosine similarity result in a positive number for such 'different' items?

正如您在示例中提到的,在某些情况下,Adjusted Cosine SimilarityRegular 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
#----------------------

直觉上我们会说用户 bc 有相似的品味,而 a 与他们有很大不同。但是正余弦相似度告诉我们一个错误的故事。

让我们计算 Adjusted Cosine Similarity,首先减去 xy

的平均值
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
#----------------------

可见调整有意义。

Should I just refrain from using the regular cosine similarity in general or only for certain scenarios?

发现问题就用合适的。

我仍然认为正则余弦相似度在我们希望对向量尺度敏感度较低的情况下很有用。例如,如果分数 [2,1] 被认为与 [4,2] 或 [8,4] 非常相似,那么正则将做得很好。