推荐系统中的协同过滤
协同过滤(Collaborative Filtering)是推荐系统中经典且广泛应用的技术之一。其核心思想是通过分析用户的行为数据,识别具有相似偏好的用户群体,从而预测用户未来的偏好。与基于物品显性特征的推荐不同,协同过滤主要依赖于用户行为之间的相似性,因此对数据本身有较高的依赖性。
协同过滤包括两种主要类型:基于用户的协同过滤和基于物品的协同过滤。此外,还有一些扩展方法,如矩阵分解和混合协同过滤。
基于用户的协同过滤(User-based Collaborative Filtering)
在基于用户的协同过滤中,推荐系统根据用户之间的相似性进行推荐。如果用户A和用户B在历史记录上有类似的兴趣,那么用户B喜欢的物品很可能也会适合用户A。
算法步骤
-
寻找相似用户集合:通过计算用户之间的兴趣相似度,找到与目标用户兴趣最相似的用户集合。常用的相似度计算方法包括余弦相似度和皮尔逊相关系数。
-
推荐物品:在相似用户集合中,识别这些用户喜欢但目标用户尚未互动的物品,并将这些物品推荐给目标用户。
示例与计算过程
假设有如下的用户与电影评分数据,我们将使用 余弦相似度 来计算用户之间的相似性,并基于相似性进行推荐。
用户 | 电影A评分 | 电影B评分 | 电影C评分 | 电影D评分 |
---|---|---|---|---|
用户1 | 5 | 4 | 3 | 2 |
用户2 | 5 | 5 | 2 | 3 |
用户3 | 4 | 3 | 5 | 1 |
用户4 | 5 | 4 | 4 | 2 |
我们将以 用户1 为目标用户,计算用户1与其他用户之间的相似度,并推荐其他用户喜欢但用户1未评分过的电影。
余弦相似度计算过程
余弦相似度公式:
余弦相似度
=
∑
i
=
1
n
r
u
i
⋅
r
v
i
∑
i
=
1
n
r
u
i
2
⋅
∑
i
=
1
n
r
v
i
2
\text{余弦相似度} = \frac{\sum_{i=1}^{n} r_{ui} \cdot r_{vi}}{\sqrt{\sum_{i=1}^{n} r_{ui}^2} \cdot \sqrt{\sum_{i=1}^{n} r_{vi}^2}}
余弦相似度=∑i=1nrui2⋅∑i=1nrvi2∑i=1nrui⋅rvi
其中,
r
u
i
r_{ui}
rui和
r
v
i
r_{vi}
rvi分别表示用户
u
u
u和用户
v
v
v对物品
i
i
i的评分。
计算用户1和其他用户的相似度
- 用户1 和 用户2 的相似度
- 用户评分乘积和: 5 × 5 + 4 × 5 + 3 × 2 + 2 × 3 = 25 + 20 + 6 + 6 = 57 5 \times 5 + 4 \times 5 + 3 \times 2 + 2 \times 3 = 25 + 20 + 6 + 6 = 57 5×5+4×5+3×2+2×3=25+20+6+6=57
- 用户1评分平方和: 5 2 + 4 2 + 3 2 + 2 2 = 25 + 16 + 9 + 4 = 54 5^2 + 4^2 + 3^2 + 2^2 = 25 + 16 + 9 + 4 = 54 52+42+32+22=25+16+9+4=54
- 用户2评分平方和: 5 2 + 5 2 + 2 2 + 3 2 = 25 + 25 + 4 + 9 = 63 5^2 + 5^2 + 2^2 + 3^2 = 25 + 25 + 4 + 9 = 63 52+52+22+32=25+25+4+9=63
余弦相似度 ( 用户 1 , 用户 2 ) = 57 54 ⋅ 63 = 57 7.35 ⋅ 7.94 ≈ 0.97 \text{余弦相似度}(用户1, 用户2) = \frac{57}{\sqrt{54} \cdot \sqrt{63}} = \frac{57}{7.35 \cdot 7.94} \approx 0.97 余弦相似度(用户1,用户2)=54⋅6357=7.35⋅7.9457≈0.97
- 用户1 和 用户3 的相似度
- 用户评分乘积和: 5 × 4 + 4 × 3 + 3 × 5 + 2 × 1 = 20 + 12 + 15 + 2 = 49 5 \times 4 + 4 \times 3 + 3 \times 5 + 2 \times 1 = 20 + 12 + 15 + 2 = 49 5×4+4×3+3×5+2×1=20+12+15+2=49
- 用户3评分平方和: 4 2 + 3 2 + 5 2 + 1 2 = 16 + 9 + 25 + 1 = 51 4^2 + 3^2 + 5^2 + 1^2 = 16 + 9 + 25 + 1 = 51 42+32+52+12=16+9+25+1=51
余弦相似度 ( 用户 1 , 用户 3 ) = 49 54 ⋅ 51 = 49 7.35 ⋅ 7.14 ≈ 0.94 \text{余弦相似度}(用户1, 用户3) = \frac{49}{\sqrt{54} \cdot \sqrt{51}} = \frac{49}{7.35 \cdot 7.14} \approx 0.94 余弦相似度(用户1,用户3)=54⋅5149=7.35⋅7.1449≈0.94
- 用户1 和 用户4 的相似度
- 用户评分乘积和: 5 × 5 + 4 × 4 + 3 × 4 + 2 × 2 = 25 + 16 + 12 + 4 = 57 5 \times 5 + 4 \times 4 + 3 \times 4 + 2 \times 2 = 25 + 16 + 12 + 4 = 57 5×5+4×4+3×4+2×2=25+16+12+4=57
- 用户4评分平方和: 5 2 + 4 2 + 4 2 + 2 2 = 25 + 16 + 16 + 4 = 61 5^2 + 4^2 + 4^2 + 2^2 = 25 + 16 + 16 + 4 = 61 52+42+42+22=25+16+16+4=61
余弦相似度 ( 用户 1 , 用户 4 ) = 57 54 ⋅ 61 = 57 7.35 ⋅ 7.81 ≈ 0.98 \text{余弦相似度}(用户1, 用户4) = \frac{57}{\sqrt{54} \cdot \sqrt{61}} = \frac{57}{7.35 \cdot 7.81} \approx 0.98 余弦相似度(用户1,用户4)=54⋅6157=7.35⋅7.8157≈0.98
基于相似度的推荐
根据计算结果,用户1与其他用户的相似度排序如下:
- 用户4:相似度 = 0.98
- 用户2:相似度 = 0.97
- 用户3:相似度 = 0.94
根据这个相似度排序,我们优先考虑用户4和用户2的物品进行推荐。我们将推荐用户4和用户2喜欢但用户1未评分过的电影。
用户4喜欢的电影:电影C(评分为4)
用户2喜欢的电影:电影D(评分为3)
因此,基于用户的协同过滤推荐结果是:推荐用户1观看 电影C 和 电影D,因为这些电影受到了与用户1相似度最高的其他用户的好评。
基于物品的协同过滤(Item-based Collaborative Filtering)
基于物品的协同过滤通过分析物品之间的相似性来进行推荐。其核心思想是,如果一个用户对某物品A表现出高度兴趣,那么系统会推荐与物品A相似的其他物品。
示例与计算过程
我们将继续使用相同的评分数据,并通过 Jaccard 相似度和 余弦相似度来计算电影之间的相似性。
Jaccard 相似度计算过程
在使用 Jaccard 相似度之前,我们需要将评分数据转换为布尔值形式,将评分≥3的项视为“喜欢”(1),评分<3的项视为“不喜欢”(0)。转换后的数据如下:
用户 | 电影A | 电影B | 电影C | 电影D |
---|---|---|---|---|
用户1 | 1 | 1 | 1 | 0 |
用户2 | 1 | 1 | 0 | 1 |
用户3 | 1 | 1 | 1 | 0 |
用户4 | 1 | 1 | 1 | 0 |
Jaccard 相似度公式:
Jaccard 相似度
=
∣
A
∩
B
∣
∣
A
∪
B
∣
\text{Jaccard 相似度} = \frac{|A \cap B|}{|A \cup B|}
Jaccard 相似度=∣A∪B∣∣A∩B∣
电影A 与其他电影的Jaccard相似度
- 电影A 和 电影B:交集 = 4, 并集 = 4,相似度 = 4 4 = 1.0 \frac{4}{4} = 1.0 44=1.0
- 电影A 和 电影C:交集 = 3, 并集 = 4,相似度 = 3 4 = 0.75 \frac{3}{4} = 0.75 43=0.75
- 电影A 和 电影D:交集 = 1, 并集 = 4,相似度 = 1 4 = 0.25 \frac{1}{4} = 0.25 41=0.25
余弦相似度计算过程
根据余弦相似度公式,计算电影A与其他电影的相似度:
- 电影A 和 电影B:相似度 = 0.99
- 电影A 和 电影C:相似度 = 0.91
- 电影A 和 电影D:相似度 = 0.96
结果分析
相似度类型 | 电影A与B | 电影A与C | 电影A与D |
---|---|---|---|
Jaccard | 1.0 | 0.75 | 0.25 |
余弦相似度 | 0.99 | 0.91 | 0.96 |
这两种方法各有优劣,Jaccard 相似度更适合离散数据,而余弦相似度更适合连续评分数据。
总结
在推荐系统中,协同过滤是通过用户的历史行为数据来预测用户偏好的重要技术。基于用户和物品的协同过滤结合矩阵分解等方法,使得推荐系统能够更加精准和个性化。
希望这篇文章对协同过滤的基本概念、示例以及计算过程做了清晰的阐述,如有任何问题或建议,欢迎讨论交流!