ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

二部图-激活扩散模型

二部图-激活扩散模型

激活扩散模型课件

沿用《热传导模型-课件》中的表 2-3 数据。

1. 模型思想

激活扩散模型是一种直观的图扩散算法。

  • 把用户—项目反馈数据表示成二部图;
  • 从目标用户节点出发,沿着边逐层扩散;
  • 记录首次到达每个未交互项目所需的步数和到达次数;
  • 步数越短、到达次数越多的项目,推荐优先级越高。

在二部图中,从用户出发到达项目的路径长度只能是奇数(3 步、5 步、7 步……)。


2. 推荐流程

  1. 设定最大扩散步长;
  2. 从目标用户节点出发,沿边扩散;
  3. 去掉目标用户已交互过的项目,得到候选项目集;
  4. 按“首次到达步数 → 到达次数”排序生成推荐列表。

3. 案例数据

表 2-3:用户购买记录

用户购买项目
Ab, d
Ba, b, c
Ca, b, d
Da, 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 的路径数:

候选项目路径到达次数
aA-b-B-a、A-b-C-a、A-d-C-a3
cA-b-B-c1

因此,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=​3664​5672​1321​4351​0112​​

用户 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=​24374020​30394517​915157​21243010​3776​​

用户 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高效实现。
  • 缺点:假设每条边影响相同,容易受活跃用户或热门项目偏置影响,因此后续发展出带权重的物质扩散和热传导模型。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进