背景介绍
最近在开发产品的过程中,想为用户推送他们感兴趣的内容。一开始,我尝试在后端通过标签排序算法来为用户推荐,但效果并不理想。不仅需要构建大量的标签体系,后端的维护成本也很高。
后来,我想到了推荐系统。虽然之前从未接触过推荐系统(因为提及推荐系统,首先想到的就是机器学习),但我还是决定开始研究,因为推荐系统是实现用户个性化体验的最佳实践。最终,我选择了基于物品的协同过滤算法(Item-CF),因为它是推荐系统中最简单、最直观的算法之一。
算法原理
基于物品的协同过滤算法(Item-CF)
Item-CF的核心思想是"喜欢同样物品的用户也会喜欢相似的物品"。例如:如果用户A喜欢物品B,那么系统会将和物品B最相似的物品D推荐给用户A。
相似度计算
在Item-CF中,相似度计算是核心环节。我们使用余弦相似度来计算物品之间的相似程度。
根据余弦定理,对于坐标中的两个向量,其夹角越小,则相似度越大:
余弦相似度计算公式:
c o s ( θ ) = ∑ i = 1 n A i B i ∑ i = 1 n A i 2 ∑ i = 1 n B i 2 cos(θ) = \frac{\sum_{i=1}^n A_i B_i}{\sqrt{\sum_{i=1}^n A_i^2} \sqrt{\sum_{i=1}^n B_i^2}} cos(θ)=∑i=1nAi2∑i=1nBi2∑i=1nAiBi
公式说明:
- 分子是向量A和向量B的点积
- 分母是向量A和向量B的模长的乘积
- 结果范围在[-1,1]之间,值越大表示越相似
除了余弦相似度,还有其他计算方法:
- 皮尔逊相关系数
- Jaccard相似系数
- 欧几里得距离
算法实现流程
1. 收集用户对物品的评分数据
将用户对物品的评分数据组织成矩阵 R,其中 R[u][i] 表示用户 u 对物品 i 的评分:
- R[u][i] ∈ [1,5]:表示用户的评分值
- R[u][i] = 0:表示用户未对该物品评分
例如:
用户\物品 | 物品1 | 物品2 | 物品3 | 物品4 |
---|---|---|---|---|
用户1 | 5 | 3 | 0 | 4 |
用户2 | 4 | 0 | 2 | 5 |
2. 构建物品共现矩阵
共现矩阵 W 记录了物品之间被同一用户同时评分的次数:
- W[i][j] 表示物品i和物品j被同一用户同时评分的次数
- W 是一个对称矩阵,即 W[i][j] = W[j][i]<