基于用户的协同过滤算法(User-Based Collaborative Filtering)
字数 2779 2025-11-30 23:17:05

基于用户的协同过滤算法(User-Based Collaborative Filtering)

基于用户的协同过滤是推荐系统中最经典的算法之一,其核心思想是:如果两个用户在过去对很多物品有相似的喜好(比如都给相同的电影打了高分),那么他们在未来也可能对新的物品有相似的喜好。因此,我们可以根据“相似用户”的喜好来为当前用户推荐物品。

算法详解

  1. 数据表示:用户-物品评分矩阵
    首先,我们需要将用户的行为数据数字化。最常用的方式是构建一个用户-物品评分矩阵。

    • 矩阵结构:矩阵的行代表用户(User),列代表物品(Item)。矩阵中的每一个值 R_ui 表示用户 u 对物品 i 的评分。评分可以是显式的(如1-5星),也可以是隐式的(如点击、购买,用0/1表示)。
    • 示例:假设我们有3个用户(Alice, Bob, Charlie)和4部电影(Movie1, Movie2, Movie3, Movie4)。评分矩阵可能如下所示(- 表示未评分):
User / Movie Movie1 Movie2 Movie3 Movie4
Alice 5 3 4 4
Bob 3 1 2 3
Charlie 4 3 4 -
我们的目标是为 Charlie 预测他对 Movie4 的评分,并决定是否向他推荐。
  1. 核心步骤一:计算用户之间的相似度
    这是算法的关键。我们需要一个量化的指标来衡量任意两个用户之间的“口味”有多像。最常用的方法是余弦相似度(Cosine Similarity)皮尔逊相关系数(Pearson Correlation)。这里我们以余弦相似度为例。

    • 核心思想:将每个用户对所有物品的评分看作一个高维空间中的向量。两个用户向量的夹角越小,说明他们的方向越一致,即越相似。
    • 公式:用户 u 和用户 v 的余弦相似度计算公式为:
      similarity(u, v) = (u · v) / (||u|| * ||v||)
      其中,u · v 是向量点积,||u|| 是向量 u 的模(长度)。
    • 处理缺失值:在实际计算中,我们只考虑两个用户都评过分了的物品集合(记为 I_uv)。
    • 计算示例:计算 Alice 和 Charlie 的相似度。
      • 他们共同评分的物品是 Movie1, Movie2, Movie3。
      • Alice 的评分向量:a = [5, 3, 4]
      • Charlie 的评分向量:c = [4, 3, 4]
      • 点积 a · c = (5×4) + (3×3) + (4×4) = 20 + 9 + 16 = 45
      • Alice 的模 ||a|| = √(5² + 3² + 4²) = √(25+9+16) = √50 ≈ 7.07
      • Charlie 的模 ||c|| = √(4² + 3² + 4²) = √(16+9+16) = √41 ≈ 6.40
      • 相似度 sim(Alice, Charlie) = 45 / (7.07 × 6.40) ≈ 45 / 45.25 ≈ 0.994
        同理,我们可以计算出所有用户两两之间的相似度,形成一个相似度矩阵。
  2. 核心步骤二:寻找“最近邻”
    对于目标用户(Charlie),我们根据计算出的相似度,找出与他最相似的 k 个用户。这个用户集合被称为“k-最近邻”(k-Nearest Neighbors, k-NN)。k 是一个需要人为设定的超参数。

    • 操作:对除了 Charlie 自己以外的所有用户,按照与 Charlie 的相似度从高到低排序,取前 k 个。
    • 示例:假设 k=2,我们计算出:
      • sim(Charlie, Alice) = 0.994
      • sim(Charlie, Bob) = 待计算(假设为 0.8)
      • 那么 Charlie 的最近邻就是 {Alice, Bob}。
  3. 核心步骤三:生成预测评分
    现在我们利用最近邻的评分,来预测目标用户对某个未评分物品的评分。

    • 公式:最常用的预测公式是加权平均:
      Prediction(u, i) = (Σ [sim(u, v) * R_vi]) / Σ |sim(u, v)|
      其中,v 是遍历所有为目标用户 u 评过物品 i 的最近邻用户。R_vi 是邻居 v 对物品 i 的评分,sim(u, v) 是用户 uv 的相似度。
    • 直观理解:这个公式的意思是,每个邻居的评分都要按其与目标用户的相似度来加权。和你越像的人,他的评分对你预测结果的影响就越大。
    • 计算示例:为 Charlie 预测他对 Movie4 的评分。
      • Charlie 的最近邻是 {Alice, Bob}。
      • Alice 对 Movie4 的评分 R_Alice, M4 = 4,相似度 sim(C, A) = 0.994
      • Bob 对 Movie4 的评分 R_Bob, M4 = 3,相似度 sim(C, B) = 0.8
      • 预测评分 P(Charlie, Movie4) = (0.994 × 4 + 0.8 × 3) / (0.994 + 0.8) = (3.976 + 2.4) / 1.794 ≈ 6.376 / 1.794 ≈ 3.55
  4. 最终步骤:生成推荐
    得到预测评分后,我们可以:

    • 将所有 Charlie 未评分的物品都进行预测。
    • 然后按照预测评分从高到低进行排序。
    • 将排名最高的 Top-N 个物品推荐给 Charlie。这就是经典的 “Top-N 推荐” 任务。

总结与优缺点

  • 优点

    • 原理直观:易于理解和实现。
    • 可解释性强:可以告诉用户“因为和您喜好相似的用户也喜欢这个,所以推荐给您”。
    • 能发现隐性兴趣:可以发现用户自己可能都没意识到的潜在兴趣。
  • 缺点

    • 数据稀疏性:用户和物品数量巨大时,评分矩阵非常稀疏(绝大多数值是缺失的),导致难以找到可靠相似的用户。
    • 冷启动问题:新用户或新物品由于没有评分数据,无法有效地参与相似度计算,难以被推荐。
    • 计算扩展性:随着用户数量的增长,计算所有用户两两之间的相似度(时间复杂度为 O(N²))会变得非常昂贵。

为了解决这些缺点,后续发展出了基于物品的协同过滤(Item-Based CF)矩阵分解(Matrix Factorization) 等更高级的算法。

基于用户的协同过滤算法(User-Based Collaborative Filtering) 基于用户的协同过滤是推荐系统中最经典的算法之一,其核心思想是:如果两个用户在过去对很多物品有相似的喜好(比如都给相同的电影打了高分),那么他们在未来也可能对新的物品有相似的喜好。因此,我们可以根据“相似用户”的喜好来为当前用户推荐物品。 算法详解 数据表示:用户-物品评分矩阵 首先,我们需要将用户的行为数据数字化。最常用的方式是构建一个用户-物品评分矩阵。 矩阵结构 :矩阵的行代表用户(User),列代表物品(Item)。矩阵中的每一个值 R_ui 表示用户 u 对物品 i 的评分。评分可以是显式的(如1-5星),也可以是隐式的(如点击、购买,用0/1表示)。 示例 :假设我们有3个用户(Alice, Bob, Charlie)和4部电影(Movie1, Movie2, Movie3, Movie4)。评分矩阵可能如下所示( - 表示未评分): | User / Movie | Movie1 | Movie2 | Movie3 | Movie4 | | :----------- | :----: | :----: | :----: | :----: | | Alice | 5 | 3 | 4 | 4 | | Bob | 3 | 1 | 2 | 3 | | Charlie | 4 | 3 | 4 | - | 核心步骤一:计算用户之间的相似度 这是算法的关键。我们需要一个量化的指标来衡量任意两个用户之间的“口味”有多像。最常用的方法是 余弦相似度(Cosine Similarity) 和 皮尔逊相关系数(Pearson Correlation) 。这里我们以余弦相似度为例。 核心思想 :将每个用户对所有物品的评分看作一个高维空间中的向量。两个用户向量的夹角越小,说明他们的方向越一致,即越相似。 公式 :用户 u 和用户 v 的余弦相似度计算公式为: similarity(u, v) = (u · v) / (||u|| * ||v||) 其中, u · v 是向量点积, ||u|| 是向量 u 的模(长度)。 处理缺失值 :在实际计算中,我们只考虑两个用户都评过分了的物品集合(记为 I_uv )。 计算示例 :计算 Alice 和 Charlie 的相似度。 他们共同评分的物品是 Movie1, Movie2, Movie3。 Alice 的评分向量: a = [5, 3, 4] Charlie 的评分向量: c = [4, 3, 4] 点积 a · c = (5×4) + (3×3) + (4×4) = 20 + 9 + 16 = 45 Alice 的模 ||a|| = √(5² + 3² + 4²) = √(25+9+16) = √50 ≈ 7.07 Charlie 的模 ||c|| = √(4² + 3² + 4²) = √(16+9+16) = √41 ≈ 6.40 相似度 sim(Alice, Charlie) = 45 / (7.07 × 6.40) ≈ 45 / 45.25 ≈ 0.994 同理,我们可以计算出所有用户两两之间的相似度,形成一个相似度矩阵。 核心步骤二:寻找“最近邻” 对于目标用户(Charlie),我们根据计算出的相似度,找出与他最相似的 k 个用户。这个用户集合被称为“k-最近邻”(k-Nearest Neighbors, k-NN)。 k 是一个需要人为设定的超参数。 操作 :对除了 Charlie 自己以外的所有用户,按照与 Charlie 的相似度从高到低排序,取前 k 个。 示例 :假设 k=2,我们计算出: sim(Charlie, Alice) = 0.994 sim(Charlie, Bob) = 待计算(假设为 0.8) 那么 Charlie 的最近邻就是 {Alice, Bob}。 核心步骤三:生成预测评分 现在我们利用最近邻的评分,来预测目标用户对某个未评分物品的评分。 公式 :最常用的预测公式是加权平均: Prediction(u, i) = (Σ [sim(u, v) * R_vi]) / Σ |sim(u, v)| 其中, v 是遍历所有为目标用户 u 评过物品 i 的最近邻用户。 R_vi 是邻居 v 对物品 i 的评分, sim(u, v) 是用户 u 和 v 的相似度。 直观理解 :这个公式的意思是,每个邻居的评分都要按其与目标用户的相似度来加权。和你越像的人,他的评分对你预测结果的影响就越大。 计算示例 :为 Charlie 预测他对 Movie4 的评分。 Charlie 的最近邻是 {Alice, Bob}。 Alice 对 Movie4 的评分 R_Alice, M4 = 4 ,相似度 sim(C, A) = 0.994 Bob 对 Movie4 的评分 R_Bob, M4 = 3 ,相似度 sim(C, B) = 0.8 预测评分 P(Charlie, Movie4) = (0.994 × 4 + 0.8 × 3) / (0.994 + 0.8) = (3.976 + 2.4) / 1.794 ≈ 6.376 / 1.794 ≈ 3.55 最终步骤:生成推荐 得到预测评分后,我们可以: 将所有 Charlie 未评分的物品都进行预测。 然后按照预测评分从高到低进行排序。 将排名最高的 Top-N 个物品推荐给 Charlie。这就是经典的 “Top-N 推荐” 任务。 总结与优缺点 优点 : 原理直观 :易于理解和实现。 可解释性强 :可以告诉用户“因为和您喜好相似的用户也喜欢这个,所以推荐给您”。 能发现隐性兴趣 :可以发现用户自己可能都没意识到的潜在兴趣。 缺点 : 数据稀疏性 :用户和物品数量巨大时,评分矩阵非常稀疏(绝大多数值是缺失的),导致难以找到可靠相似的用户。 冷启动问题 :新用户或新物品由于没有评分数据,无法有效地参与相似度计算,难以被推荐。 计算扩展性 :随着用户数量的增长,计算所有用户两两之间的相似度(时间复杂度为 O(N²))会变得非常昂贵。 为了解决这些缺点,后续发展出了 基于物品的协同过滤(Item-Based CF) 、 矩阵分解(Matrix Factorization) 等更高级的算法。