深入理解协同过滤算法

协同过滤(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)

    协同过滤的优缺点

    优点

    • 不需要理解物品本身的特性
    • 能够发现意想不到的推荐结果
    • 算法简单,易于实现

    缺点

    • 冷启动问题:新用户或新物品无法得到推荐
    • 稀疏性问题:用户-物品矩阵通常非常稀疏
    • 流行度偏差:倾向于推荐热门物品

    实践建议

    在实际应用中,建议结合以下策略:

  • 混合多种协同过滤方法
  • 加入时间衰减因子
  • 使用矩阵分解等技术处理稀疏性
  • 结合内容-based 方法解决冷启动问题