推荐系统学习(二):召回-协同过滤-ItemCF

基于物品的协同过滤 (ItemCF)

核心思想
ItemCF 的核心假设是:用户的兴趣具有连贯性,喜欢某个物品的用户,往往也会对与该物品相似的其他物品感兴趣。例如,一个购买了T恤的用户,很可能也会喜欢与这件T恤相似的夹克。算法的目标是回答“和你喜欢的物品相似的还有什么”。


第一步:物品相似度计算

余弦相似度 (Cosine Similarity)

当只有用户的交互行为(如点击、购买,即隐式反馈)而没有具体评分时,常使用余弦相似度。它通过计算两个物品的共同用户数,并进行标准化,以消除热门物品因用户数多而带来的影响。

1
w_{ij} = \frac{|N(i) \cap N(j)|}{\sqrt{|N(i)|\cdot|N(j)|}}

其中,N(i) 是与物品 i 有过交互的用户集合,|N(i) ∩ N(j)| 是物品 ij 的共同用户数。

皮尔逊相关系数 (Pearson Correlation Coefficient)

当有具体评分数据(显式反馈)时,皮尔逊相关系数是更好的选择。它通过将每个用户的评分减去该物品的平均分,来消除不同物品评分标准(如有的物品普遍分高,有的偏低)带来的偏差,更关注评分的相对趋势。

1
w_{ij} = \frac{\sum_{u \in U_{ij}} (r_{ui} - \bar{r}_i)(r_{uj} - \bar{r}_j)}{\sqrt{\sum_{u \in U_{ij}} (r_{ui} - \bar{r}_i)^2} \sqrt{\sum_{u \in U_{ij}} (r_{uj} - \bar{r}_j)^2}}

其中,U_ij 是同时评价过物品 ij 的用户集合,r_ui 是用户 u 对物品 i 的评分,r̄_i 是物品 i 的平均评分。


第二步: 候选物品推荐

加权求和 (用于隐式反馈)

计算出物品相似度后,可以预测用户 u 对未接触物品 j 的兴趣分数。方法是找到用户 u 历史上喜欢的物品,并将这些物品与物品 j 的相似度进行加权求和。

1
p(u, j) = \sum_{i \in N(u)} w_{ji} \cdot r_{ui}

其中,N(u) 是用户 u 交互过的物品集合,w_ji 是物品 ji 的相似度,r_ui 是用户 u 对物品 i 的兴趣强度(可以简单设为1)。

基于平均分的评分预测 (用于显式反馈)

当使用皮尔逊相关系数时,评分预测公式会以物品的平均分作为基准,并根据用户对相似物品的评分偏好进行调整。

1
\hat{r}_{uj} = \bar{r}_j + \frac{\sum_{i \in N(u)} w_{ji} (r_{ui} - \bar{r}_i)}{\sum_{i \in N(u)} |w_{ji}|}

这个公式的逻辑是:用物品 j 的平均分作为基础预测,然后加上一个修正项,该修正项是用户对相似物品的评分(减去该物品的平均分)与相似度的加权平均。


第三步:一些优化

计算复杂度优化

暴力计算所有物品对的相似度时间复杂度高达 O(|I|^2),在物品数量巨大时不可行。由于许多物品对没有共同用户,相似度为0,计算它们是浪费时间。

基于用户-物品倒排表的优化
该方法不直接遍历物品对,而是从用户出发,其时间复杂度为 O(Σ|N(u)|²) ≈ O(R * k̄),其中 R 是总交互数, 是用户平均交互的物品数。在稀疏数据中,此方法效率远高于暴力计算。

  1. 构建用户-物品倒排表:为每个用户 u 维护一个他/她交互过的物品列表 N(u)
  2. 计算物品共现矩阵:遍历每个用户的物品列表 N(u),将列表中的物品两两配对 (i, j),在共现矩阵 C[i][j] 中对应位置加1。这个矩阵记录了物品 ij 的共同用户数。
  3. 计算最终相似度:利用共现矩阵 C 和每个物品的总用户数 N,代入余弦相似度公式,计算出最终的物品相似度矩阵。
Swing算法:面向工业场景的优化

传统ItemCF存在热门物品主导推荐、无法区分噪音点击等问题。Swing算法通过分析用户-物品交互的图结构来优化相似度计算,其核心思想是:如果两个物品被许多没有太多其他共同兴趣的用户对同时喜欢,那么这两个物品的关联性就更强。

1
\text{Swing}(i, j) = \sum_{u \in U_i \cap U_j} \sum_{v \in U_i \cap U_j, u \neq v} w_u w_v \frac{1}{\alpha + |I_u \cap I_v|}

其中,U_i 是与物品 i 交互的用户集合,I_u 是用户 u 交互的物品集合,w_u 是用户权重,α 是平滑系数。这个公式惩罚了兴趣广泛的用户对所产生的共现。

Surprise算法:互补商品推荐

作为Swing的扩展,专门用于挖掘具有时序性和方向性的互补关系(如先买手机再买手机壳)。它通过融合类别、商品和聚类三个层面的信息来综合衡量互补性。最终的互补关系分数通过线性组合得出:

1
\text{Surprise}(i, j) = \alpha \cdot \text{Swing}(i, j) + (1-\alpha) \cdot \text{Comp}_{\text{cluster}}(i, j)

其中,Comp_cluster(i, j) 代表通过商品聚类缓解数据稀疏问题后,计算出的聚类层面的互补相关性。


推荐系统学习(二):召回-协同过滤-ItemCF
https://whosefrienda.github.io/2026/01/15/推荐系统学习-二-:召回-协同过滤-ItemCF/
作者
WhosefriendA
发布于
2026年1月15日
许可协议