物质扩散模型课件
沿用《热传导模型-课件》中的表 2-3 数据。
1. 模型思想
物质扩散模型把用户偏好看作一种可以在二部图上流动的“资源”或“能量”。
- 每个项目节点把资源平均分给相邻用户;
- 每个用户节点把收集到的资源再平均分给相邻项目;
- 整个扩散过程满足资源守恒——资源既不会凭空产生,也不会凭空消失。
与热传导模型的区别:
| 特点 | 物质扩散 | 热传导 |
|---|---|---|
| 守恒性 | 守恒 | 不守恒(由恒温热源驱动) |
| 归一化 | 按“源节点”的度均分 | 按“目标节点”的度取平均 |
2. 推荐流程
步骤 1:初始化资源
目标用户购买过的项目资源设为1,其余为0:
S(0)=Ru⋅S^{(0)} = R_{u\cdot}S(0)=Ru⋅
步骤 2:项目 → 用户(式 2-20)
每个项目把资源均分给相邻用户:
bu=∑j∈usjk(Ij)b_u = \sum_{j\in u} \frac{s_j}{k(I_j)}bu=j∈u∑k(Ij)sj
步骤 3:用户 → 项目(式 2-21)
每个用户把资源均分给相邻项目:
sj′=∑u∈jbuk(Uu)s'_j = \sum_{u\in j} \frac{b_u}{k(U_u)}sj′=u∈j∑k(Uu)bu
合并后得到转移矩阵WP:
WPj,i=∑u∈j∩i1k(Ii)⋅k(Uu)WP_{j,i} = \sum_{u\in j\cap i} \frac{1}{k(I_i)\cdot k(U_u)}WPj,i=u∈j∩i∑k(Ii)⋅k(Uu)1
矩阵形式为:
S′=WP⋅SS' = WP \cdot SS′=WP⋅S
稳态满足:
S∗=WP⋅S∗S^* = WP \cdot S^*S∗=WP⋅S∗
3. 案例数据
表 2-3:用户购买记录
| 用户 | 购买项目 | 用户度k(U) |
|---|---|---|
| A | b, d | 2 |
| B | a, b, c | 3 |
| C | a, b, d | 3 |
| D | a, e | 2 |
项目度:
k(I_a) = 3k(I_b) = 3k(I_c) = 1k(I_d) = 2k(I_e) = 1
目标用户:A,初始资源:
S(0)=(0,1,0,1,0)⊤S^{(0)} = (0, 1, 0, 1, 0)^\topS(0)=(0,1,0,1,0)⊤
4. 手动演算
4.1 构造转移矩阵WP
WPj,i=∑u∈j∩i1k(Ii)⋅k(Uu)WP_{j,i} = \sum_{u\in j\cap i} \frac{1}{k(I_i)\cdot k(U_u)}WPj,i=u∈j∩i∑k(Ii)⋅k(Uu)1
例如,从项目b扩散到项目a:
- 共同购买用户为 B、C
k(I_b)=3(源项目 b 的度)k(U_B)=3,k(U_C)=3
WPa,b=13×3+13×3=29WP_{a,b} = \frac{1}{3\times 3} + \frac{1}{3\times 3} = \frac{2}{9}WPa,b=3×31+3×31=92
完整矩阵:
WP=(7/182/91/31/61/22/97/181/35/1201/91/91/3001/95/1805/1201/60001/2) WP = \begin{pmatrix} 7/18 & 2/9 & 1/3 & 1/6 & 1/2 \\ 2/9 & 7/18 & 1/3 & 5/12 & 0 \\ 1/9 & 1/9 & 1/3 & 0 & 0 \\ 1/9 & 5/18 & 0 & 5/12 & 0 \\ 1/6 & 0 & 0 & 0 & 1/2 \end{pmatrix}WP=7/182/91/91/91/62/97/181/95/1801/31/31/3001/65/1205/1201/20001/2
每列和为 1,说明物质扩散是列随机的,满足资源守恒。
4.2 第一轮扩散
初始资源S⁽⁰⁾ = (0, 1, 0, 1, 0)ᵀ,只取WP的第 2 列(b)和第 4 列(d)相加:
| 项目 | 计算 | 资源 |
|---|---|---|
| a | WP_{a,b}×1 + WP_{a,d}×1 = 2/9 + 1/6 | 7/18 ≈ 0.39 |
| b | WP_{b,b}×1 + WP_{b,d}×1 = 7/18 + 5/12 | 29/36 ≈ 0.81 |
| c | WP_{c,b}×1 + WP_{c,d}×1 = 1/9 + 0 | 1/9 ≈ 0.11 |
| d | WP_{d,b}×1 + WP_{d,d}×1 = 5/18 + 5/12 | 25/36 ≈ 0.69 |
| e | WP_{e,b}×1 + WP_{e,d}×1 = 0 + 0 | 0 |
第一轮结果:
S(1)=(718, 2936, 19, 2536, 0)⊤S^{(1)} = \left(\frac{7}{18},\ \frac{29}{36},\ \frac19,\ \frac{25}{36},\ 0\right)^\topS(1)=(187,3629,91,3625,0)⊤
4.3 多轮迭代结果
| 轮次 | a | b | c | d | e |
|---|---|---|---|---|---|
| 初始 | 0.00 | 1.00 | 0.00 | 1.00 | 0.00 |
| 第1轮 | 0.39 | 0.81 | 0.11 | 0.69 | 0.00 |
| 第2轮 | 0.48 | 0.73 | 0.17 | 0.56 | 0.06 |
| 第3轮 | 0.53 | 0.68 | 0.19 | 0.49 | 0.11 |
| 第4轮 | 0.56 | 0.65 | 0.20 | 0.45 | 0.14 |
| 第5轮 | 0.57 | 0.63 | 0.20 | 0.43 | 0.17 |
4.4 生成推荐
去掉 A 已购买的b和d:
| 候选项目 | 资源 |
|---|---|
| a | 0.57 |
| c | 0.20 |
| e | 0.17 |
- Top-1 推荐:项目 a
- Top-2 推荐:项目 a 和 c
5. 与热传导模型的对比
在完全相同的数据和初始条件下:
| 模型 | Top-1 | Top-2 |
|---|---|---|
| 物质扩散 | a | a, c |
| 热传导 | c | c, a |
- 物质扩散倾向于把资源保留在高度项目附近(a 的度最高),推荐结果更“热门”;
- 热传导倾向于提升低度项目的温度(c 的度为 1),推荐结果更“长尾”。
6. 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)user_deg=R.sum(axis=1)item_deg=R.sum(axis=0)# 物质扩散转移矩阵 WP# WP_{j,i} = sum_u r_{u,j}*r_{u,i} / (k(I_i)*k(U_u))n_items=R.shape[1]WP=np.zeros((n_items,n_items))forjinrange(n_items):foriinrange(n_items):foruinrange(R.shape[0]):ifR[u,j]andR[u,i]:WP[j,i]+=1.0/(item_deg[i]*user_deg[u])print("WP 转移矩阵:")print(np.round(WP,4))print("每列和(应为 1):",np.round(WP.sum(axis=0),4))# 初始资源:A 购买过 b, ds=np.array([0.,1.,0.,1.,0.])print("\n迭代过程:")foriinrange(6):print(f"第{i}轮:{np.round(s,4)}")s=WP @ s# 推荐items=['a','b','c','d','e']purchased={1,3}# b, dcandidates=[(items[j],score)forj,scoreinenumerate(s)ifjnotinpurchased]candidates.sort(key=lambdax:x[1],reverse=True)print("\n候选项目排序(去掉 A 已购买的 b, d):")foritem,scoreincandidates:print(f"{item}:{score:.4f}")运行结果
WP 转移矩阵: [[0.3889 0.2222 0.3333 0.1667 0.5 ] [0.2222 0.3889 0.3333 0.4167 0. ] [0.1111 0.1111 0.3333 0. 0. ] [0.1111 0.2778 0. 0.4167 0. ] [0.1667 0. 0. 0. 0.5 ]] 每列和(应为 1): [1. 1. 1. 1. 1.] 迭代过程: 第0轮: [0. 1. 0. 1. 0.] 第1轮: [0.3889 0.8056 0.1111 0.6944 0. ] 第2轮: [0.4815 0.7315 0.1667 0.5556 0.0556] 第3轮: [0.5267 0.679 0.1893 0.4861 0.1111] 第4轮: [0.556 0.6481 0.1999 0.4491 0.1389] 第5轮: [0.5719 0.6276 0.2013 0.4282 0.1667] 候选项目排序(去掉 A 已购买的 b, d): a: 0.5719 c: 0.2013 e: 0.16677. 小结
- 物质扩散模型把用户偏好看作守恒的资源流。
- 核心公式:
S' = WP · S,转移矩阵按“源项目”的度归一化。 - 推荐结果倾向于热门项目,计算简单、物理意义清晰。
- 与热传导模型互补:一个偏热门,一个偏长尾。