0%

推荐系统

推荐系统中的协同过滤算法:原理、实现与应用

协同过滤(Collaborative Filtering)是推荐系统中最经典且应用广泛的算法之一,其核心思想是利用用户群体的行为数据(如评分、点击、购买),发现用户或物品之间的相似性,进而为用户推荐其可能感兴趣的物品。与基于内容的推荐不同,协同过滤无需依赖物品的具体特征(如电影的类型、书籍的作者),仅通过用户行为的 “协同” 模式即可生成推荐。

协同过滤的核心思想与分类

协同过滤的核心假设是:

如果用户 A 和用户 B 在过去对某些物品有相似的偏好,那么用户 A 未来可能喜欢用户 B 喜欢的其他物品;反之亦然。

根据数据利用方式的不同,协同过滤可分为两大主流类型:

  1. 基于用户的协同过滤(User-Based Collaborative Filtering) 找到与目标用户兴趣相似的 “邻居用户”,将邻居用户喜欢的物品推荐给目标用户。
  2. 基于物品的协同过滤(Item-Based Collaborative Filtering) 计算物品之间的相似度(如 “喜欢物品 A 的用户也喜欢物品 B”),为用户推荐与其之前喜欢的物品相似的其他物品。

基于用户的协同过滤(User-Based CF)

算法流程

步骤 1:构建用户 - 物品评分矩阵

假设存在用户集合U = {u1, u2, ..., um}和物品集合I = {i1, i2, ..., in},构建一个m×n的评分矩阵R,其中R[u][i]表示用户u对物品i的评分(若未评分则为 0 或空)。

示例矩阵(行:用户,列:物品,值:评分 1-5):

用户 \ 物品 电影 A 电影 B 电影 C 电影 D 电影 E
用户 1 5 4 0 0 1
用户 2 0 0 5 4 0
用户 3 5 0 0 0 1
用户 4 0 0 4 5 0
步骤 2:计算用户相似度

衡量两个用户uv的相似度,常用方法:

  • 皮尔逊相关系数(Pearson Correlation):衡量两个用户评分趋势的一致性(取值范围 [-1,1],越接近 1 越相似)。 公式:

    sim(u,v)=iIuv(R[u][i]R¯[u])(R[v][i]R¯[v])iIuv(R[u][i]R¯[u])2iIuv(R[v][i]R¯[v])2

    其中,I_uv是用户uv共同评分的物品集合,\bar{R}[u]是用户u的平均评分。

  • 余弦相似度(Cosine Similarity):将用户的评分向量视为高维空间中的向量,相似度为向量夹角的余弦值(取值范围 [0,1])。 公式:

    sim(u,v)=iIR[u][i]R[v][i]iIR[u][i]2iIR[v][i]2

示例: 用户 1 和用户 3 都喜欢电影 A(评分 5)和电影 E(评分 1),相似度较高;用户 2 和用户 4 都喜欢电影 C 和电影 D,相似度较高。

步骤 3:找到相似邻居

为目标用户u筛选出相似度最高的k个用户(通常k=20-100),称为 “邻居”。

步骤 4:生成推荐评分

对目标用户u未评分的物品i,通过邻居的评分加权预测其评分:

R^[u][i]=R¯[u]+vN(u)sim(u,v)(R[v][i]R¯[v])vN(u)|sim(u,v)|

其中,N(u)是用户u的邻居集合,\hat{R}[u][i]是预测评分。

步骤 5:推荐物品

将预测评分最高的前N个物品推荐给用户。

优势与局限

优势 局限
可发现跨领域的推荐(如用户喜欢小众物品) 新用户 “冷启动” 问题(无历史数据,难以计算相似度)
无需物品特征,适用于非结构化数据(如图片、音乐) 随着用户量增长,相似度计算复杂度升高(O (m²))
能捕捉用户兴趣的动态变化 推荐解释性较差(“因为和你相似的人喜欢” 较模糊)

基于物品的协同过滤(Item-Based CF)

算法流程

步骤 1:构建用户 - 物品评分矩阵(同上)
步骤 2:计算物品相似度

衡量两个物品ij的相似度,核心思想:如果喜欢物品i的用户大多也喜欢物品j,则两者相似

常用方法:

  • 余弦相似度:将物品的用户评分向量视为向量,计算夹角余弦。 公式:

    $\text{sim}(i,j) = \frac{\sum{u \in U{ij}} R[u][i] \cdot R[u][j]}{\sqrt{\sum{u \in U} R[u][i]^2} \cdot \sqrt{\sum{u \in U} R[u][j]^2}}$

    其中,U_ij是同时评分物品ij的用户集合。

  • 调整余弦相似度:去除用户评分偏差(如有的用户习惯打高分,有的习惯打低分)。 公式:

    $\text{sim}(i,j) = \frac{\sum{u \in U{ij}} (R[u][i] - \bar{R}[u]) \cdot (R[u][j] - \bar{R}[u])}{\sqrt{\sum{u \in U{ij}} (R[u][i] - \bar{R}[u])^2} \cdot \sqrt{\sum{u \in U{ij}} (R[u][j] - \bar{R}[u])^2}}$

示例: 电影 A 和电影 E 被用户 1 和用户 3 同时评分且趋势一致(A 高、E 低),相似度较高;电影 C 和电影 D 被用户 2 和用户 4 同时高评分,相似度较高。

步骤 3:生成推荐评分

对目标用户u,根据其已评分的物品i,找到相似物品j,加权预测评分:
$\hat{R}[u][j] = \frac{\sum{i \in S(u)} \text{sim}(i,j) \cdot R[u][i]}{\sum{i \in S(u)} |\text{sim}(i,j)|}$

其中,S(u)是用户u已评分的物品集合。

步骤 4:推荐物品

将预测评分最高的前N个物品推荐给用户。

优势与局限

优势 局限
物品相似度较稳定(用户行为变化快,物品特征变化慢) 新物品 “冷启动” 问题(无评分数据,难以计算相似度)
可预先计算物品相似度,推荐时效率高(适合高并发场景) 难以推荐跨类别物品(如从电影推荐书籍)
推荐解释性强(“因为你喜欢 A,所以推荐相似的 B”) 对小众物品不友好(评分数据少,相似度计算不准)

协同过滤的改进:矩阵分解(Matrix Factorization)

传统协同过滤在处理稀疏评分矩阵(大部分用户未评分大部分物品)时效果较差,矩阵分解是解决该问题的主流方法,其核心思想是: 将高维的用户 - 物品评分矩阵R分解为两个低维矩阵:

  • 用户矩阵Um×k):每行表示一个用户的k维潜在特征(如 “文艺偏好”“动作片偏好”)。
  • 物品矩阵Vn×k):每行表示一个物品的k维潜在特征。

通过两个低维矩阵的乘积近似还原原矩阵:R ≈ U × V^T,其中k是潜在特征维度(通常取 50-200)。

1. 核心公式

预测评分:R^[u][i]=U[u]V[i]T(用户u的特征向量与物品i的特征向量的内积)。

2. 训练目标

通过最小化预测误差优化UV

$\min{U,V} \sum{(u,i) \in R} (R[u][i] - \hat{R}[u][i])^2 + \lambda (||U[u]||^2 + ||V[i]||^2)$

其中,λ是正则化参数,防止过拟合。

3. 优势

  • 有效处理稀疏矩阵,预测精度高于传统协同过滤。
  • 可捕捉用户和物品的潜在特征,发现非显性关联。
  • 计算复杂度低(O(k(m+n))),适合大规模数据。

协同过滤的工程实践与挑战

1. 冷启动问题(Cold Start)

  • 新用户 / 新物品:无历史数据时,无法计算相似度或分解矩阵。

解决方案:

  • 结合基于内容的推荐(如用用户注册信息或物品特征初始化)。
  • 利用热门物品 / 用户进行 “试探性” 推荐,积累初始数据。

2. 数据稀疏性

  • 当评分矩阵稀疏度过高(如 < 1% 的用户 - 物品有评分),相似度计算误差大。

解决方案:

  • 采用矩阵分解或深度学习模型(如神经协同过滤 NCF)。
  • 引入隐式反馈(如点击、浏览时长)补充显式评分。

3. 可扩展性

  • 当用户 / 物品量达百万级时,传统相似度计算(O(m²)或O(n²))难以实时响应。

解决方案:

  • 离线预计算相似度,在线仅做推荐排序。
  • 采用近似最近邻算法(如 Locality-Sensitive Hashing)加速相似度搜索。

典型应用场景

  • 电商平台:如亚马逊的 “购买了该商品的用户还购买了…”(基于物品的 CF)。
  • 流媒体平台:如 Netflix 的电影推荐、Spotify 的音乐推荐(矩阵分解为主)。
  • 社交平台:如 Facebook 的 “你可能认识的人”(基于用户的 CF)

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10