【问题标题】:Choice between an adjusted cosine similarity vs regular cosine similarity调整余弦相似度与常规余弦相似度之间的选择
【发布时间】:2017-04-04 15:05:49
【问题描述】:

我正在开发一个基于项目的 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
我在这个例子中对它们进行了四舍五入

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

任何帮助将不胜感激!

【问题讨论】:

    标签: recommendation-engine cosine-similarity collaborative-filtering


    【解决方案1】:

    为什么常规余弦相似度会导致此类“不同”项目的正数?

    正如您在示例中已经提到的,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
    #----------------------
    

    直觉上我们会说用户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
    #----------------------
    

    很明显,调整是有意义的。

    我应该在一般情况下还是只在某些情况下避免使用正则余弦相似度?

    当你发现有问题时,使用合适的。

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

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2017-12-12
      • 2011-01-01
      • 2014-02-25
      • 2020-02-11
      • 2013-05-24
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多