1. 推荐系统召回算法概述
在推荐系统架构中,召回阶段负责从海量物品池中快速筛选出用户可能感兴趣的候选集。就像图书馆管理员需要先从百万藏书中挑出几十本你可能爱看的书,再让专业书评人(排序模型)做精细推荐一样。今天要介绍的ItemCF、Swing和UserCF,就是三种最经典的协同过滤召回算法。
我曾在电商平台负责过推荐系统优化,实测ItemCF在商品推荐场景的点击率能比热门榜单高37%。这些算法看似简单,但实际落地时有很多工程细节需要注意。下面我会结合工业级实现经验,拆解这三种算法的数学原理、实现细节和避坑指南。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基于物品的协同过滤(ItemCF)
2.1 核心思想与数学原理
ItemCF的核心假设是:用户会喜欢与他们过去喜欢的物品相似的物品。想象你在书店买了《三体》,系统不是简单推荐其他科幻小说,而是通过数学方法计算哪些书与《三体》被同一批用户喜欢。
物品相似度计算公式(余弦相似度变体):
code复制sim(i₁,i₂) = ∑(like(u,i₁)*like(u,i₂)) / √(∑like²(u,i₁)) * √(∑like²(u,i₂))
这个公式的本质是计算两个物品在用户偏好空间中的夹角余弦值。我在实践中发现,当用户行为数据稀疏时,直接使用Jaccard相似度(不考虑权重)效果反而更好。
重要提示:like(u,i)需要做归一化处理!不同用户的行为次数差异可能达百倍,直接使用原始点击次数会导致活跃用户主导相似度计算。
2.2 工业级实现细节
2.2.1 离线索引构建
实际工程中我们会用Spark实现分布式计算。以电商场景为例:
python复制# 用户-物品交互矩阵 (COO格式)
user_items = spark.sparseMatrix(
rows=user_ids,
cols=item_ids,
values=interaction_weights # 归一化后的点击/购买权重
)
# 物品-物品相似度计算
item_sim = user_items.T.dot(user_items) # 矩阵乘法
norms = np.sqrt(np.diag(item_sim))
item_sim = item_sim / norms[:, No
