Fouss F., Pirotte A., Renders J. M. and Saerens M. Random-walk computation of similarities between nodes of a graph, with application to collaborative recommendation. IEEE Transactions on Knowledge and Data Engineering (TKDE), 2007.
概
本文介绍 first-passage time / cost 以及相应的 CTD (Commute Time Distance) 的显式计算公式.
符号说明
- G={V,E}, 图;
- V={v1,…,vn}, 顶点;
- E={eij}, 边集;
- W∈Rn×n, wij 为边 eij 上的权重, 若 wij=0 表示 i,j 之间不存在边;
- d∈Rn, di=∑jwij;
- D:=diag(d)∈Rn×n, 对角化;
- L:=D−W, 带权重的 Laplacian 矩阵;
- P=D−1W∈Rn×n, pij=P(j|i)=wij/di, 转移概率 (i→j).
-
假设图 G 是连通图, 此时可证明 rank(L)=n−1, 此时我们可以将 L 表示为:
L=UΛUT=n∑i=2λiuiuTi,(1)
其中
U=[u2,…,un]∈Rn×(n−1),Λ=diag([λ2,…,λn])∈R(n−1)×(n−1),0<λ2≤…≤λn;
-
注意到
L1=0,(2)
故实际上 1 是 L 的对应 λ1=0 的特征向量,
于是我们可以定义其 L 的伪逆
L†:=UΛ−1UT,
且满足
LL†=L†L=n∑i=2uiuT=I−1n11T.
主要内容
Random Walk
Random Walk 是指给定状态 s(t)=i, 然后按照概率 P(s(t+1)=j|s(t)=i)=pij 的概率进行转移, 由此可以采样一个序列:
[s(0),s(1),…].
time/cost/distance
假设从状态 s(t)=i 直接转移到状态 s(t+1)=j 需要消耗 cij, 则从 s(0) 到 s(t) 总共消耗了:
t∑τ=1cs(τ−1)s(τ),
自然地, 我们关心从状态 i 出发首次抵达状态 j所需的消耗:
ξ(i,j|s)=Tij∑τ=1cs(τ−1)s(τ),Tij=min(t≥0|s(t)=k and s(0)=i).
注意到, cij≡1,∀i,j, ξ(i,j|s)=Tij.
那么对于整个图 G 而言, 从状态 i 到状态 j 的平均消耗可以定义为:
o(j|i):=Es[ξ(i,j|s)],(3)
特别地定义
m(j|i):=Es[Tij].(4)
为状态 i 到状态 j 的平均首达时间.
此外, 我们可以用马氏链的方式去理解 (3) (4):
o(j|i)=pij⋅cij+∑k≠jpik(cik+o(j|k)), j≠i,o(i|i)=0.(5)
即从状态 i 到状态 j 的消耗等价于直接到 j 的消耗 pijcij 加上先到其它点 j 的消耗 pikcik 然后加上再从这个 k 到 j 的消耗 piko(j|k). 类似地
m(j|i)=pij+∑k≠jpik(1+m(j|k)),j≠i,m(i|i)=0.(6)
无论是 o(j|i) 还是 m(j|i), 一般来讲都不具有对称性, 而以下的 CTD 则符合这一性质. Commute-time distance 定义为:
n(i,j)=m(j|i)+m(i|j),
此时 n(i,j) 满足一个距离的定义:
n(i,j)≥0 n(i,j)=0⇔i=j n(i,j)=n(j,i) n(i,j)≤n(i,k)+n(k,j).
注: 证明请参考文章中的参考文献.
私以为, 可以定义一个类似的 commute-cost distance
o(j|i)+o(i|j),
不知道有没有类似的概念存在.
利用伪逆求解 o, m
o(j|i)=∑k(L†ik−L†jk+L†jj−L†ij)dkrk,m(j|i)=∑k(L†ik−L†jk+L†jj−L†ij)dk.
其中 rk=∑jpkjckj.
proof:
定义 O=[o(j|i)],C=[cij], 此外我们用 oi,ci 来表示 O,C 的第 i 行, 其它的也是类似规定的.
注意到 (j≠i)
oij=o(j|i)=pijcij+∑k≠jpik(cik+okj)=[∑k≠jpik(cik+okj)+pij(cik+~ojj)]−pij~ojj.
其中 ~ojj 是人为给定的数, 其存在的目的是为了方便我们用矩阵的形式表达.
令 r∈Rn 满足 ri=pTici, 并记 ~O 满足 [~O]ii=~oii,[~O]ij=oij,j≠i, 则
用矩阵形式表达即为:
[~O]ij=[r1T+P(~O−~Od)]ijj≠i,(A1)
其中 ~Od:=diag([~o11,…,~onn]).
我们再来考察下列方程:
~O=r1T+P(~O−~Od),(A2)
一般说来, 因为 ~Od 是给定的, 所以 (A1, A2) 是等价的 (如果二者均存在解), 但是注意到:
dT~O=dTr1T+dTP(~O−~Od)=dTr1T+dT(~O−~Od)←dTP=dT,
故 (A2) 有解必须满足:
dT~Od=dTr1T→~oii=dTrdi.(A3)
这意味着, 倘若我们想通过 (A2) 来求解方程, 那么 ~Od 必须满足 (A3) 的条件.
故我们现在求解的思路是:
- 用 (A3) 的值指定 oii;
- 然后用 (A2) 求解 ~O;
- 令 (保证 oii=0 ):
O=~O−~Od,
此时 O 为 (A1) 的解.
但是我们可以取巧, 直接通过下列方程求解 O:
~O−~Od=r1T+P(~O−~Od)−~Od↔O=r1T+PO−~Od↔O=r1T+D−1WO−~Od↔DO=Dr1T+WO−D~Od↔LO=Dr1T−D~Od↔L†LO=L†D[r1T−~Od]↔(I−1n11T)O=L†D[r1T−~Od].
令 zT=1n1TO 可得:
oij=zj+∑k(L†ik−L†ij)dkrk,
通过 ojj=0 可以得到
zj=∑k(L†jj−L†jk)dkrk,
于是
o(j|i)=oij=∑k(L†ik−L†jk+L†jj−L†ij)dkrk.(A4)
因为上式对于 o(i,i)=0 也满足, 所以 (A4) 就是最终的解. 此外, 在 cij≡1 的时候, rk=1, 故
m(j|i)=oij=∑k(L†ik−L†jk+L†jj−L†ij)dk.(A5)
CTD
通过上面的结论, 我们可以知道
n(i,j)=m(j|i)+m(i|j)=(L†ii+L†jj−2L†ij)vol(G).
这里 vol(G)=∑kdk.
假设我们为每个结点 vi 指定一个 embedding xi∈Rn−1, 满足
X=[x1,x2,…,xn]=Λ−12UT∈R(n−1)×n.
则
L†=XTX,
于是
∥xi−xj∥22=L†ii+L†jj−2L†ij.
故
n(i,j)=vol(G)∥xi−xj∥22.
故 CTD 实际上衡量了'最优' embeddings 的一个 ∥⋅∥22 度量.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)