文章目录
Random Walk
随机过程中定义的随机游走是每过一个单位时间,游走点固定向左或向右移动一个单位
推广到多维,一般情况下是:
对于点
x
0
∈
R
N
x_0\in R^N
x0∈RN,每个单位时间内:
- 随机生成一个n维向量 u u u
- 将其标准化为 u ′ = u ∑ i = 1 n u i 2 u'=\frac{u}{\sqrt{\sum_{i=1}^nu_i^2}} u′=∑i=1nui2u
- 以可变步长 λ \lambda λ为幅度进行一次随机游动,即 x 1 = x 0 + λ u ′ x_1=x_0+\lambda u' x1=x0+λu′
对于图结构的数据,random walk是指,在一张图的任意一个顶点:
- 遍历者以概率1-a游走到这个定点的邻居
- 遍历者以a的概率跳跃到途中的任意一个顶点
这样的游走会以频率的方式体现出graph中每一个顶点被访问到的概率。
Random walk with start(RWR)
随机游走算法可以利用于检测整个图的概率分布,而RWR算法以及它的各种变体:
- 在CV研究中适用于图像分割
- 在graph结构中则适用于基于图结构中的一个base node,构建出它的邻居节点的分布情况。这一算法广泛应用于图结构的数据采样。
它的基本思想是:
- 从一个或一系列base node开始遍历一张图
- 在任意一个节点以1-a的概率移动到一个随机选择的邻点,以a概率跳回起点
RWR的实现
基于经典文章:Fast RandomWalk with Restart and Its Applications
符号定义:
数学表达
Input: The normalized weighted matrix W ~ \tilde{W} W~ and the starting vector e i ⃗ \vec{e_i} ei
Output: The ranking vector r i ⃗ \vec{r_i} ri
对于从指定位置(
e
i
⃗
\vec{e_i}
ei)出发期望的遍历点位置
r
i
⃗
\vec{r_i}
ri,它的值表示为:
r
i
⃗
=
c
W
~
r
i
⃗
+
(
1
−
c
)
e
i
⃗
\vec{r_i}=c\tilde{W}\vec{r_i}+(1-c)\vec{e_i}
ri=cW~ri+(1−c)ei (1)
从中可以计算出
r
i
⃗
=
(
1
−
c
)
(
1
−
c
W
~
)
−
1
e
i
⃗
=
(
1
−
c
)
Q
−
1
e
i
⃗
\vec{r_i}=(1-c)(1-c\tilde{W})^{-1}\vec{e_i}\\ =(1-c)Q^{-1}\vec{e_i}
ri=(1−c)(1−cW~)−1ei=(1−c)Q−1ei
可以看出在实际图含义上它是随机游动的,但是
r
i
⃗
\vec{r_i}
ri是数值累计的。
classic实现
- OnTheFly
最基础的方法是按照(1)式递归收敛求解(条件一般是是 r i ⃗ \vec{r_i} ri的L2范数的变化小于一定阈值 ξ 1 \xi_1 ξ1或指达到了指定的迭代次数m)。它被称为OnTheFly方法。这种方法在数据库较大时比较耗时。
优化点: r i ⃗ \vec{r_i} ri的分布存在局部性(这体现出了graph中节点的community性),所以只对存在了节点i的图的parition(注意,这个分割并不一定意味着完全不连通,只不过是距离较远参考意义很小)进行计算,其他的 r i j r_{ij} rij显然可以直接置0. - PreCompute
预先计算出 Q − 1 Q^{-1} Q−1,这种方法在数据库较大时比较耗空间。
优化点:可以通过低秩近似来快速计算 Q − 1 Q^{-1} Q−1
RWR的快速实现
通过节点的locality,以及图的线性相关性,可以使用近似算法快速计算RWR。
Off-line流程
- 使用拉普拉斯正则化计算出 W ~ \tilde{W} W~
- 使用诸如METIS软件包等方法将图分割成k个partition(METIS简单实用可见https://metis.readthedocs.io/en/latest/)
- 将 W ~ \tilde{W} W~基于分割结果分为 W ~ = W 1 ~ + W 2 ~ \tilde{W}=\tilde{W_1}+\tilde{W_2} W~=W1~+W2~。其中 W 1 ~ \tilde{W_1} W1~包含全部partition内部的权重矩阵, W 2 ~ \tilde{W_2} W2~包含全部partition外部的权重矩阵,显然这二者交集为空。
- 按照partition序列将
W
1
~
\tilde{W_1}
W1~做成如下表示:
- 通过上述分解出的
W
1
~
\tilde{W_1}
W1~,计算
Q
1
,
i
−
1
Q_{1,i}^{-1}
Q1,i−1:
Q 1 , i − 1 = ( 1 − c W 1 , i ~ ) − 1 Q_{1,i}^{-1}=(1-c\tilde{W_{1,i}})^{-1} Q1,i−1=(1−cW1,i~)−1 - 将Q与W值按同样的方式进行排列,得到
Q
1
−
1
Q_1^{-1}
Q1−1:
- 对
W
2
~
\tilde{W_2}
W2~部分,做低秩近似:
W 2 ~ = U S V \tilde{W_2}=USV W2~=USV(这里似乎可以另开一个线程去做) - 计算parition间项
Λ
~
\tilde{\Lambda}
Λ~:
Λ ~ = ( S − 1 − c V Q 1 − 1 U ) − 1 \tilde{\Lambda}=(S^{-1}-cVQ_1^{-1}U)^{-1} Λ~=(S−1−cVQ1−1U)−1
On-line查询流程
根据off-line计算的结果,直接计算
r
i
⃗
\vec{r_i}
ri:
r
i
⃗
=
(
1
−
c
)
(
Q
1
−
1
e
i
⃗
+
c
Q
1
−
1
U
Λ
~
V
Q
1
−
1
e
i
⃗
)
\vec{r_i}=(1-c)(Q_1^{-1}\vec{e_i}+cQ_1^{-1}U\tilde{\Lambda}VQ_1^{-1}\vec{e_i})
ri=(1−c)(Q1−1ei+cQ1−1UΛ~VQ1−1ei)
Λ ~ \tilde{\Lambda} Λ~的含义
这里实际上是利用舍曼-莫里森公式求解矩阵逆运算的一种方式:
https://zhuanlan.zhihu.com/p/44607246
!!!简化后的快速实现
在上述实现中,如果k=n,也即每个节点都分一个partition,那么显然 W 1 ~ = 0 , W 2 ~ = W ~ \tilde{W_1}=0,\tilde{W_2}=\tilde{W} W1~=0,W2~=W~,并且因此 Q 1 = I Q_1=I Q1=I,这样可以对上述实现进行简化:
off-line部分
- 使用拉普拉斯正则化计算出 W ~ \tilde{W} W~
- 直接对正则化后的权重矩阵进行低秩近似:
W ~ = U S V \tilde{W}=USV W~=USV - node间项: Λ ~ = ( S − 1 − c V U ) − 1 \tilde{\Lambda}=(S^{-1}-cVU)^{-1} Λ~=(S−1−cVU)−1
on-line部分
查询计算: r i ⃗ = ( 1 − c ) ( e i ⃗ + c U Λ ~ V e i ⃗ ) \vec{r_i}=(1-c)(\vec{e_i}+cU\tilde{\Lambda}V\vec{e_i}) ri=(1−c)(ei+cUΛ~Vei)
低秩近似的实现
1. 特征值分解
特征值分解适用于拉普拉斯正则化处理的邻接矩阵,对其他方式处理的邻接矩阵,可以使用SVD分解
简单的实现是对W进行特征值分解:
W
2
~
=
U
S
U
T
V
=
U
T
\tilde{W_2}=USU^T\\V=U^T
W2~=USUTV=UT
这样的方法可以减少50%的空间消耗,但是特征分解比较耗时。
!!!2. 分区低秩近似
如果将 W 2 ~ \tilde{W_2} W2~纵分为t个partition,name计算低秩近似的方法为:
- 构建 U ∈ R n × t U\in R^{n\times t} U∈Rn×t,其中 U i j = ∑ k ∈ i t h p a r t i t i o n W i k U_{ij}=\sum_{k\in i^{th}\ partition}W_{ik} Uij=∑k∈ith partitionWik,也即U的第i列是W第i个partition的列向量的和。
- S = ( U T U ) − 1 S=(U^TU)^{-1} S=(UTU)−1
- V = U T W 2 ~ V=U^T\tilde{W_2} V=UTW2~