【算法无用系列】通过余弦相似度计算电影、用户相似度
话不多说,本文通过电影推荐系统中,基于余弦相似度算法计算出用户相似和电影相似原理。希望可以帮助一些代码不懂的同学一些思路。
记录用户电影评分数据
一般情况来说,会根据用户的行为,记录当前用户对于某个电影的评分,简单的计算公式为
- 浏览 +1
- 点赞 +2
- 评论 +3
- 收藏 +5
等等,当然这个累加的评分可以自行在代码中配置。最后我们会得出这样的一个用户电影评分关系表,如下所示,记录了用户和电影的评分。
用户ID | 电影ID | 评分 |
---|---|---|
1 | 101 | 5.0 |
1 | 102 | 3.0 |
1 | 103 | 2.5 |
2 | 101 | 2.0 |
2 | 102 | 2.5 |
2 | 103 | 5.0 |
2 | 104 | 2.0 |
3 | 101 | 5.0 |
3 | 104 | 4.0 |
3 | 105 | 4.5 |
4 | 101 | 4.0 |
4 | 103 | 3.0 |
4 | 104 | 2.0 |
4 | 105 | 4.0 |
5 | 102 | 4.0 |
5 | 103 | 4.0 |
5 | 104 | 1.0 |
转换矩阵
电影ID 101 102 103 104 105
用户ID
1 5.0 3.0 2.5 0.0 0.0
2 2.0 2.5 5.0 2.0 0.0
3 5.0 0.0 0.0 4.0 4.5
4 4.0 0.0 3.0 2.0 4.0
5 0.0 4.0 4.0 1.0 0.0
对于二维表的数据转换为这样的一个矩阵。那么如何判断两个用户的相似程度如何呢?
横着看这几个电影的评分,如果这些分数都特别相似,那就可以证明两个用户的兴趣爱好类似,越相似,那么相似度越高。
竖着看也是一样,如果两列数值越相似,那么就可以认为两个电影越相似(当前这仅仅是测试,在真实的场景中,这样的单一维度来计算电影相似度是不够的)。
或者这样的一个多维度矩阵无法和我们在高中学到的二维坐标系XY轴绑定起来。那么我可以把维度减少一下。如下,变成了高中时常见的XY轴二维坐标。
电影ID 101 102
用户ID
1 5.0 3.0
2 2.0 2.5
如上图所示,形成两个向量,两个向量的夹角越小,则证明两个 越相似。
当前,以上数据只是为了更好理解计算公式,真实情况下,维度会更多,如下就是一个5个维度,不过我们可以继续套用公式。
电影ID 101 102 103 104 105
用户ID
1 5.0 3.0 2.5 0.0 0.0
2 2.0 2.5 5.0 2.0 0.0
3 5.0 0.0 0.0 4.0 4.5
4 4.0 0.0 3.0 2.0 4.0
5 0.0 4.0 4.0 1.0 0.0