举个例子,假设我有一个非常简单的数据集。我获得了一个包含三列的csv,user_id,book_id,rating。评级可以是任意数字0-5,其中0表示用户已经 NOT 评定了该书。
假设我随机选择了三个用户,并获得了这些功能/评级向量。
Martin:< 3,3,5,1,2,3,2,2,5>
Jacob:< 3,3,5,0,0,0,0,0,0>
Grant:< 1,1,1,2,2,2,2,2,2>
相似度计算:
+--------------+---------+---------+----------+
| | M & J | M & G | J & G |
+--------------+---------+---------+----------+
| Euclidean | 6.85 | 5.91 | 6.92 |
+--------------+---------+---------+----------+
| Cosine | .69 | .83 | .32 |
+--------------+---------+---------+----------+
现在,我对相似性的期望是马丁和雅各布最相似。我希望这是因为他们对这两本书所评价的书籍的评分相同。但我们最终发现马丁和格兰特是最相似的。
我在数学上理解我们是如何得出这个结论的,但是我不明白我如何依靠余弦角距离或欧几里德距离作为计算相似性的一种方法,如果这种类型的事情发生的话。马丁和格兰特的解释比马丁和雅各布更加相似?
我曾经想到的只是计算欧几里德距离,但忽略了一个用户没有给这本书评价过的所有书籍。
然后我最终得到了这个
+--------------+---------+---------+----------+
| | M & J | M & G | J & G |
+--------------+---------+---------+----------+
| Euclidean | 0 | 5.91 | 6.92 |
+--------------+---------+---------+----------+
| Cosine | .69 | .83 | .32 |
+--------------+---------+---------+----------+
当然,现在我的欧氏距离为0,这符合我对推荐系统的期望。我看到许多教程和讲座使用余弦角度距离忽略未评级的书籍,而不是使用欧几里德并忽略它们,所以我认为这一般不能起作用。
编辑:
只是稍微试验一下,我调整雅各布的特征向量更加相似:
Jacob:< 3,3,5,1,2,3,2,0,0>
当我与马丁计算余弦角距离时,我仍然只得到.82!仍然不如马丁和格兰特相似,但通过检查我会发现这两者非常相似。
有人可以帮助解释我的想法错误,并可能建议另一种相似性措施吗?
答案 0 :(得分:2)
正如你已经注意到的那样,Euclidean和Cosine Angular是基于距离的。例如,3到5之间的距离远小于3到0之间的距离,雅各布的等级中有多个零,雅各布和马丁之间不会有太多相似之处。 您的示例的主要问题是您假设0表示没有评级,其中实际上由两个公式解释为评级0(这是可能的最低评级)如果您将跳过零评级并仅比较评级的用户他们有共同点,而马林和雅各布的相似度为1!
答案 1 :(得分:0)
您的想法是正确的,但您的代码可能会错误地计算余弦相似度。
Kris已经给你一个正确的答案,但我想指出,当你计算余弦相似度时,你并没有跳过那些未评级的项目。我们可以看到第一个和第二个表的余弦相似性完全相同。这可能是您代码中的错误。