激活扩散模型课件
沿用《热传导模型-课件》中的表 2-3 数据。
1. 模型思想
激活扩散模型是一种直观的图扩散算法。
- 把用户—项目反馈数据表示成二部图;
- 从目标用户节点出发,沿着边逐层扩散;
- 记录首次到达每个未交互项目所需的步数和到达次数;
- 步数越短、到达次数越多的项目,推荐优先级越高。
在二部图中,从用户出发到达项目的路径长度只能是奇数(3 步、5 步、7 步……)。
2. 推荐流程
- 设定最大扩散步长;
- 从目标用户节点出发,沿边扩散;
- 去掉目标用户已交互过的项目,得到候选项目集;
- 按“首次到达步数 → 到达次数”排序生成推荐列表。
3. 案例数据
表 2-3:用户购买记录
| 用户 | 购买项目 |
|---|---|
| A | b, d |
| B | a, b, c |
| C | a, b, d |
| D | a, e |
对应二部图:
- 用户 A 与项目 b、d 相连;
- 用户 B 与项目 a、b、c 相连;
- 用户 C 与项目 a、b、d 相连;
- 用户 D 与项目 a、e 相连。
目标用户:A。
4. 手动演算
4.1 最大步长为 3
从用户 A 出发:
- 第 1 步:到达项目b、d(A 已购买的项目);
- 第 2 步:从 b、d 到达用户A、B、C;
- 第 3 步:从 A、B、C 到达项目a、b、c、d。
去掉 A 已购买的 b、d,候选项目集为:{a, c}。
统计从 A 出发、长度为 3 的路径数:
| 候选项目 | 路径 | 到达次数 |
|---|---|---|
| a | A-b-B-a、A-b-C-a、A-d-C-a | 3 |
| c | A-b-B-c | 1 |
因此,3 步扩散推荐顺序为:a > c。
4.2 最大步长为 5
继续扩散:
- 第 4 步:从 a、c 回到用户节点;
- 第 5 步:从用户节点到达更多项目,包括e。
此时,用户 A 的候选项目扩展为:{a, c, e}。
步数越长,能到达的冷门项目越多,缓解了传统协同过滤“推荐范围受限”的问题。
5. 矩阵表示
设用户-项目反馈矩阵为R(行为用户,列为项目),则扩散步长为2k+1时的用户画像为:
S(2k+1)=R(RTR)kS^{(2k+1)} = R(R^T R)^kS(2k+1)=R(RTR)k
5.1 3 步扩散结果
S(3)=RRTR=(35140663316725142112)S^{(3)} = RR^TR = \begin{pmatrix} 3 & 5 & 1 & 4 & 0 \\ 6 & 6 & 3 & 3 & 1 \\ 6 & 7 & 2 & 5 & 1 \\ 4 & 2 & 1 & 1 & 2 \end{pmatrix}S(3)=RRTR=36645672132143510112
用户 A 的画像为第 1 行:
SA(3)=(3,5,1,4,0)S^{(3)}_A = (3, 5, 1, 4, 0)SA(3)=(3,5,1,4,0)
含义:
- a=3,b=5,c=1,d=4,e=0
- 去掉已购买的 b、d,候选排序为a > c
5.2 5 步扩散结果
S(5)=R(RTR)2=(2430921337391524740451530720177106)S^{(5)} = R(R^TR)^2 = \begin{pmatrix} 24 & 30 & 9 & 21 & 3 \\ 37 & 39 & 15 & 24 & 7 \\ 40 & 45 & 15 & 30 & 7 \\ 20 & 17 & 7 & 10 & 6 \end{pmatrix}S(5)=R(RTR)2=2437402030394517915157212430103776
用户 A 的画像为第 1 行:
SA(5)=(24,30,9,21,3)S^{(5)}_A = (24, 30, 9, 21, 3)SA(5)=(24,30,9,21,3)
去掉已购买的 b、d,候选排序为a > c > e。
6. 推荐结果汇总
| 最大步长 | 用户 A 推荐结果 |
|---|---|
| 3 步 | a, c |
| 5 步 | a, c, e |
步长为 3 时只能到达与 A 有共同用户的项目;步长为 5 时,e 也能被推荐。
7. Python 实现
importnumpyasnp# 用户-项目反馈矩阵R=np.array([[0,1,0,1,0],# A: b, d[1,1,1,0,0],# B: a, b, c[1,1,0,1,0],# C: a, b, d[1,0,0,0,1],# D: a, e],dtype=float)items=['a','b','c','d','e']users=['A','B','C','D']# 激活扩散:S^(2k+1) = R (R^T R)^kdefactivation_diffusion(R,k):"""计算 2k+1 步扩散后的用户画像矩阵"""RTR=R.T @ R M=np.eye(RTR.shape[0])for_inrange(k):M=M @ RTRreturnR @ Mprint("3 步扩散结果 S^(3):")S3=activation_diffusion(R,1)print(S3.astype(int))print("\n5 步扩散结果 S^(5):")S5=activation_diffusion(R,2)print(S5.astype(int))# 为用户 A 生成推荐target_user=0# Apurchased={1,3}# b, ddefrecommend(S,user_idx,purchased):scores=S[user_idx]candidates=[(items[j],score)forj,scoreinenumerate(scores)ifjnotinpurchased]candidates.sort(key=lambdax:x[1],reverse=True)returncandidatesprint("\n用户 A 在 3 步扩散后的推荐:",[c[0]forcinrecommend(S3,target_user,purchased)])print("用户 A 在 5 步扩散后的推荐:",[c[0]forcinrecommend(S5,target_user,purchased)])运行结果
3 步扩散结果 S^(3): [[3 5 1 4 0] [6 6 3 3 1] [6 7 2 5 1] [4 2 1 1 2]] 5 步扩散结果 S^(5): [[24 30 9 21 3] [37 39 15 24 7] [40 45 15 30 7] [20 17 7 10 6]] 用户 A 在 3 步扩散后的推荐: ['a', 'c'] 用户 A 在 5 步扩散后的推荐: ['a', 'c', 'e']8. 小结
- 激活扩散模型通过“步长”控制推荐范围。
- 步长越大,推荐范围越广,能覆盖到与目标用户没有直接共同行为的冷门项目。
- 计算本质上是二部图上的路径计数,可用
R(R^T R)^k高效实现。 - 缺点:假设每条边影响相同,容易受活跃用户或热门项目偏置影响,因此后续发展出带权重的物质扩散和热传导模型。