推荐系统(Recommendation System)是信息过滤系统的一种,旨在预测用户对物品的"偏好"或"评分",从海量候选项中筛选最符合用户兴趣的内容。推荐系统已经渗透到我们生活的方方面面:
| 范式 | 核心思想 | 代表方法 | 优势 | 局限 |
|---|---|---|---|---|
| 协同过滤 | 利用群体智慧 | UserCF/ItemCF | 无需领域知识 | 冷启动/稀疏 |
| 基于内容 | 物品属性匹配 | TF-IDF/画像 | 可解释 | 信息茧房 |
| 混合方法 | 融合多种信号 | Wide&Deep | 综合优势 | 系统复杂 |
全量物品池(百万~亿级)
│ ▼【召回】多路召回,万→千
│ ▼【粗排】轻量模型,千→百
│ ▼【精排】复杂模型,百→十
│ ▼【重排】多样性/业务,十→最终展示
每一级的设计目标不同:
Precision@K = |推荐列表∩真实偏好| / K
衡量推荐列表中命中真实偏好的比例
Recall@K = |推荐列表∩真实偏好| / |真实偏好|
衡量真实偏好被推荐覆盖的比例
DCG@K = Σ(rel_i / log2(i+1))
NDCG@K = DCG@K / IDCG@K
考虑排序位置的归一化指标,位置越靠前权重越高
G = Σ|xi-xj| / (2n²·x̄)
衡量推荐分布均匀性,0=完全均匀,1=完全集中
import numpy as np
from collections import defaultdict
np.random.seed(42)
users=[f"U{i}"for i in range(1,21)]
items=[f"I{j}"for j in range(1,31)]
interactions={}
for u in users:
n=np.random.poisson(3)+1
for item in np.random.choice(items,size=min(n,len(items)),replace=False):
interactions[(u,item)]=np.random.randint(1,6)
print("="*60+"\n推荐系统基础数据分析\n"+"="*60)
print(f"用户数:{len(users)} 物品数:{len(items)}")
print(f"交互记录:{len(interactions)} 密度:{len(interactions)/(len(users)*len(items)):.4f}")
print(f"平均每用户交互:{len(interactions)/len(users):.1f}")
rc=defaultdict(int)
for r in interactions.values():rc[r]+=1
print("\n评分分布:")
for r in sorted(rc):print(f" {r}分:{chr(9608)*rc[r]} ({rc[r]})")
ip=defaultdict(int)
for(u,i),r in interactions.items():ip[i]+=1
print(f"\nTop-5热门物品:")
for i,c in sorted(ip.items(),key=lambda x:-x[1])[:5]:print(f" {i}:被{c}个用户交互")
ua=defaultdict(int)
for(u,i),r in interactions.items():ua[u]+=1
print(f"\nTop-5活跃用户:")
for u,c in sorted(ua.items(),key=lambda x:-x[1])[:5]:print(f" {u}:交互{c}个物品")
hot=[i for i,_ in sorted(ip.items(),key=lambda x:-x[1])[:5]]
print(f"\n召回-热门物品:{hot}")
t="U5";ui={i:r for(u,i),r in interactions.items() if u==t}
sc={i:ip[i]*0.3+np.random.random()*0.7 for i in items if i not in ui}
rk=sorted(sc.items(),key=lambda x:-x[1])
print(f"排序-为{t}推荐Top-5:{[(i,round(s,3))for i,s in rk[:5]]}")
hit=2;prec=hit/5;rec=hit/len(ui) if ui else 0
print(f"\nPrecision@5:{prec:.2f} Recall@5:{rec:.2f}")
pl=sorted([ip.get(i,0)for i in items]);n=len(pl)
gs=sum(abs(pl[i]-pl[j])for i in range(n)for j in range(n))
gini=gs/(2*n*sum(pl))if sum(pl)>0 else 0
print(f"物品流行度基尼系数:{gini:.4f}")
print(f"推荐覆盖率:{len(set(i for i,_ in rk[:10]))/len(items):.2%}")
# 多路召回演示
print("\n多路召回演示:")
recall_channels={"热门":hot,"随机":list(np.random.choice(items,5,replace=False))}
for ch,items_list in recall_channels.items():
print(f" {ch}通道: {items_list}")
# NDCG计算
def dcg_at_k(rel,k):
return sum(r/np.log2(i+2) for i,r in enumerate(rel[:k]))
def ndcg_at_k(rel,k):
dcg=dcg_at_k(rel,k)
idcg=dcg_at_k(sorted(rel,reverse=True),k)
return dcg/idcg if idcg>0 else 0
sim_rel=[5,3,0,4,1]
print(f"\nNDCG示例: rel={sim_rel}")
print(f" DCG@5={dcg_at_k(sim_rel,5):.4f}")
print(f" NDCG@5={ndcg_at_k(sim_rel,5):.4f}")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
| 时期 | 代表方法 | 里程碑 |
|---|---|---|
| 1992-1999 | 协同过滤 | GroupLens/Amazon ItemCF |
| 2006-2009 | 矩阵分解 | Netflix Prize |
| 2010-2015 | 特征交叉 | FM/FFM |
| 2016-2019 | 深度学习 | Wide&Deep/DeepFM/DIN |
| 2020+ | GNN/预训练 | 多模态/大模型推荐 |
本课是第1课:推荐系统概述,属于基础方法阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:修改数据密度从5%改为1%,观察评估指标变化
练习2:实现基于物品流行度的召回策略并计算覆盖率
练习3:实现NDCG@K指标的计算函数并测试
练习4:思考:什么场景下覆盖率比Precision更重要?
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解推荐系统三大范式与适用场景
✅ 掌握召回-排序-重排三阶段架构
✅ 实现基础推荐框架并计算评估指标
✅ 了解推荐系统面临的核心挑战与发展历程