协同过滤(Collaborative Filtering)是推荐系统中最经典的算法之一。其核心思想是通过分析用户的历史行为,发现用户之间的相似性或物品之间的相似性,从而进行推荐。
基于用户的协同过滤
基于用户的协同过滤(User-based CF)基本流程如下:
相似度计算
常用的相似度计算方法有:
- 余弦相似度:$\cos(\theta) = \frac{A \cdot B}{\|A\|\|B\|}$
- 皮尔逊相关系数:$r = \frac{\sum(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum(x_i - \bar{x})^2}\sqrt{\sum(y_i - \bar{y})^2}}$
- Jaccard 相似度:$J(A,B) = \frac{|A \cap B|}{|A \cup B|}$
基于物品的协同过滤
基于物品的协同过滤(Item-based CF)与基于用户的协同过滤类似,但计算的是物品之间的相似度。
python
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
def item_cf(user_item_matrix):
"""
基于物品的协同过滤
Args:
user_item_matrix: 用户-物品矩阵 (n_users, n_items)
Returns:
item_similarity: 物品相似度矩阵
"""
# 计算物品之间的余弦相似度
item_similarity = cosine_similarity(user_item_matrix.T)
return item_similarity
示例
ratings = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4]
])
similarity = item_cf(ratings)
print("物品相似度矩阵:")
print(similarity)
协同过滤的优缺点
优点
- 不需要理解物品本身的特性
- 能够发现意想不到的推荐结果
- 算法简单,易于实现
缺点
- 冷启动问题:新用户或新物品无法得到推荐
- 稀疏性问题:用户-物品矩阵通常非常稀疏
- 流行度偏差:倾向于推荐热门物品
实践建议
在实际应用中,建议结合以下策略: