开发可掌握的知识:推荐系统

推荐系统(Recommendation System)是一种信息过滤系统,其目标是预测用户对物品(如商品、电影、文章等)的偏好或评分,从而向用户推荐他们可能感兴趣的物品。推荐系统广泛应用于电商、视频平台、社交媒体、新闻推送等场景。

下面是一个典型推荐系统算法的完整流程,包括核心模块、常用算法以及整体工作流程:

一、推荐系统整体流程

一个完整的推荐系统主要包括以下步骤:

text 复制代码
1. 数据收集
2. 数据预处理
3. 特征工程
4. 模型选择与训练
5. 推荐生成(召回 + 排序)
6. 结果评估与反馈
7. 在线服务与更新

1. 数据收集(Data Collection)

收集用户行为数据和物品信息,常见数据包括:

  • 显式反馈:用户评分、点赞、收藏等(如电影评分)
  • 隐式反馈:点击、浏览、购买、停留时长等
  • 上下文信息:时间、地点、设备、天气等
  • 用户画像:年龄、性别、地域、兴趣标签等
  • 物品特征:类别、标签、描述、价格、作者等

2. 数据预处理(Data Preprocessing)

对原始数据进行清洗和转换:

  • 去除噪声(如异常点击、爬虫数据)
  • 处理缺失值
  • 数据归一化 / 标准化
  • 构建用户-物品交互矩阵(User-Item Interaction Matrix)
  • 划分训练集 / 验证集 / 测试集

3. 特征工程(Feature Engineering)

提取有效特征用于模型训练:

  • 用户侧特征:历史行为统计(如点击率、购买频次)、兴趣向量
  • 物品侧特征:类别、热度、文本嵌入(如TF-IDF、BERT)
  • 交叉特征:用户-物品交互特征(是否购买过同类商品)
  • 时序特征:最近一次交互时间、行为衰减权重

4. 模型选择与训练(Model Selection & Training)

根据场景选择合适的推荐算法。常见算法分类如下:

(1)基于内容的推荐(Content-Based)

  • 原理:根据用户历史喜欢的物品内容,推荐相似内容的物品。
  • 优点:可解释性强,无冷启动问题(对新物品友好)
  • 缺点:推荐多样性差,难以发现用户新兴趣

(2)协同过滤(Collaborative Filtering, CF)

  • 基于用户的CF:找相似用户,推荐他们喜欢的物品
  • 基于物品的CF:找相似物品,推荐用户喜欢的相似物品
  • 优点:无需物品内容信息,发现潜在兴趣
  • 缺点:冷启动问题(新用户/新物品难处理),数据稀疏性

(3)矩阵分解(Matrix Factorization, MF)

  • 将用户-物品评分矩阵分解为低维隐向量(User Embedding + Item Embedding)
  • 经典算法:SVD、SVD++、NMF
  • 优点:缓解稀疏性,捕捉隐式兴趣
  • 缺点:难以融入丰富特征

(4)深度学习模型

  • Wide & Deep:结合记忆(Wide)与泛化(Deep)
  • Neural CF(NCF) :用神经网络替代内积计算用户-物品匹配度
  • DeepFM / DIN / DIEN:融合特征交叉与用户行为序列建模
  • Graph Neural Networks(GNN) :将用户-物品交互建模为图,如 PinSage

(5)多任务学习与强化学习

  • 多目标优化(如点击率 + 转化率 + 时长)
  • 在线学习 / 强化学习(如 LinUCB、DQN)用于动态调整推荐策略

5. 推荐生成:召回(Recall) + 排序(Ranking)

由于物品库通常很大(百万级),需分两阶段:

(1)召回阶段

  • 从全量物品中快速筛选出几百~几千个候选物品

  • 常用方法:

    • 基于规则(热门、地域、新上架)
    • 协同过滤(ItemCF、UserCF)
    • 向量召回(ANN,如 Faiss、HNSW,用 Embedding 相似度)
    • 多路召回(融合多种策略)

(2)排序阶段

  • 对召回结果打分排序,输出 Top-K 推荐
  • 使用复杂模型(如 DeepFM、DIN、Transformer)
  • 输入:用户特征 + 物品特征 + 上下文 + 交叉特征
  • 输出:点击率(CTR)、转化率(CVR)等预测值

高级系统可能还有重排(Re-ranking)阶段,考虑多样性、公平性、业务规则等。


6. 评估与反馈(Evaluation & Feedback)

离线评估指标:

  • 准确率:RMSE(评分预测)、Precision@K、Recall@K、NDCG@K
  • 覆盖率、多样性、新颖性

在线评估(A/B测试):

  • CTR(点击率)、转化率、人均观看时长、GMV 等业务指标

用户反馈闭环:

  • 实时收集用户对推荐结果的行为
  • 用于在线学习或模型定期更新

7. 在线服务与模型更新

  • 实时推荐:使用流处理(如 Flink)更新用户兴趣
  • 模型部署:通过 TF Serving、TorchServe 提供在线预测
  • 增量训练:每日/每小时更新模型(如使用在线学习算法)

二、详细流程解析

1. 推荐生成:召回(Recall) + 排序(Ranking)

这个流程的核心目标是:从海量物品库中,高效、准确地为用户筛选出他们最可能感兴趣的少量物品,并最终以体验良好的方式呈现出来。


1. 召回(Recall)

  • 目标:解决算法效率问题。从数以百万甚至千万计的物品库中,快速、粗略地筛选出几百到几千的候选集合,保证召回率(尽量不遗漏用户可能喜欢的物品)。

  • 核心思想:"海选"。不计较单个物品的精确得分,而是利用多种策略从不同角度"捞"回可能相关的物品。

  • 常用策略 :工业通常采用多路召回(Multi-tower Recall) ,融合多种策略结果,再去重合并

    • 基于协同过滤:根据用户的历史行为(如点击、购买)找相似。

      • 物品协同过滤:"买了此商品的人,也买了XXX"。根据物品的共现关系进行推荐。
      • 用户协同过滤:"和你相似的人,也喜欢XXX"。找到相似用户,推荐他们喜欢的物品。
    • 基于内容:根据用户喜欢的物品的内容特征(如关键词、标签、类别)来推荐相似特征的物品。

    • 基于热点:推荐当前最热门、最流行的物品。

    • 基于模型 :使 用向量化技术(如Embedding) 将用户和物品表示为向量,通过向量相似度(如余弦相似度)进行快速检索,这是目前的主流模型方法

2. 排序(Ranking)

排序阶段通常分为两步:粗排和精排。

  • 粗排(Pre-ranking)

    • 目标:对召回阶段输出的几百上千个候选物品进行初步筛选,将数量缩减到几十或一百左右,为后续的精排阶段减压。
    • 特点:使用相对简单的模型(如逻辑回归、浅层神经网络)和少量关键特征,追求速度。
  • 精排(Ranking)

    • 目标:这是推荐系统的核心,解决算法精准度问题。它对粗排后的候选集进行精准的点击率(CTR)、转化率(CVR)等目标预测。

    • 核心思想:"决赛"。为每个物品计算一个最终的得分。

    • 常用模型

      • 传统模型:逻辑回归(LR)、梯度提升决策树(GBDT)。
      • 深度学习模型: Wide & Deep(兼顾记忆与泛化)、DeepFM(自动学习特征交叉)、DIN(针对用户兴趣多样性)等。这些模型能够处理海量特征并进行复杂的非线性拟合。
    • 关键特征

      • 用户特征:年龄、性别、兴趣标签、购买力等。
      • 物品特征:类别、价格、品牌、标签等。
      • 上下文特征:时间、地点、天气、当前页面等。
      • 交叉特征:用户与物品之间的交互特征,是提升模型效果的关键。

3. 重排(Re-ranking)

  • 目标:在精排生成的得分列表基础上,引入业务规则和多样性策略,调整最终展示给用户的列表顺序,提升用户体验和业务指标。

  • 常用策略

    • 去重:去除用户已经看过、买过或明确不喜欢的物品。
    • 多样性:避免推荐列表中出现过多同质化物品(例如,全是同一品牌的手机)。
    • 新颖性:适当给新物品或冷门物品一些曝光机会。
    • 业务规则:如保证某些战略商品的曝光位置、进行商业引流等。
相关推荐
名誉寒冰2 小时前
深入理解fd_set:从基础到实战应用(Linux/C++)
java·linux·c++
CodeAmaz2 小时前
RocketMQ怎么保证消息不丢失详解
java·rocketmq·java-rocketmq
Violet_YSWY2 小时前
阿里巴巴状态码
后端
Learner__Q2 小时前
每天五分钟:二分查找-LeetCode高频题解析_day4
python·算法·leetcode
智者知已应修善业2 小时前
【字符串提取3个整数求和】2024-2-11
c语言·c++·经验分享·笔记·算法
灵魂猎手2 小时前
Antrl4 入门 —— 使用Antrl4实现一个表达式计算器
java·后端
唯唯qwe-2 小时前
Day21:贪心算法 | 加油站,分发糖果
算法·贪心算法
zhonghua8810162 小时前
spring ai alibab agent之ReactAgent深度解读
java·人工智能·spring
moxiaoran57532 小时前
Go语言的递归函数
开发语言·后端·golang