在上一篇中提到,SimRank的计算复杂度非常高,在实际部署中是大不可能计算其真实值的,也没有必要。对于其近似值的计算来说,有很多计算方法。
在实际中,由条目-用户关系构建消费关系图 ,对应的顶点数量 (条目数加用户数)。 由此可以构成一个 邻接矩阵 , 其中 . 并可以计算出SimRank矩阵 . 显然地,矩阵 的对角线元素都是1,即 . 我们把邻接矩阵 按列进行归一化:
, 其中 .
那么,按照SimRank的定义 , 其中 表示按相同位置取大值,即 , 是人工定义的权重常数. 该定义保证. 由于实际中 是无向图,有预设 是实对称阵,即 . 同样地,也有 是实对称阵。 总是可以对角化。
由 定义可知, 与 仅在对角线上有元素不同。因此总是存在对角线矩阵 , 这里我们可以称 为对角修正矩阵[1]. 也就有
.
把上式的左边不断代入右边:
(1)
也就是说,SimRank矩阵的计算问题可以转换为对角修正矩阵的计算问题。对应地,对于SimRank中的矩阵元素 , 有
由于 是介于0到1之间的常量,所以上式是一个无穷收敛级数. 如果定义 为上式加到第 项的值,也就是
于是其误差范围:
. (2)
这对迭代次数与对应的误差范围给出了明确的关系。
由于 是常量,如果定义 , 则有
(3)
而根据定义, [2], 所以 .
到这里,对角修正矩阵 的计算还是跟 的计算差不多复杂度。
假定 是给定的, 对于已知的 , 是下式的解:
(4)
上式是离散lyapunov方程,可以使用GMRES[3]进行近似求解。 对应地,定义线性算子 .
定义 为矩阵拉直运算, 为一个 长度为的向量 ,
为算子使 , 那么[4]
其中 为Kronecker积. 为 单位矩阵的子矩阵. 矩阵 的条件数
, 这说明 的给定误差估计是存在的。
结合(1)式与(4)式:
. 根据(2)式, . 这给定了迭代的误差范围。
的GMRES求解:
global W
def matvec(x, num_iter=10, threshold=1e-4):
# approximates matvec for GMRES method
d = x.copy()
XS = scipy.sparse.csr_matrix(scipy.sparse.diags(x, 0))
for _ in range(num_iter):
XS = W.T.dot(XS).dot(W)
cond = abs(XS.data) > threshold
not_cond = np.logical_not(cond)
XS.data[not_cond] = 0.0
XS.eliminate_zeros()
if XS.data.shape[0] == 0:
break
d = d + XS.diagonal()
return d
def dSolver(y, matvec, call=my_callback):
#GMRES method
n = max(y.shape)
print('Solving key linear system...')
LA = scipy.sparse.linalg.LinearOperator((n, n), matvec=matvec, dtype=np.float64)
y = y.astype(np.int)
d, info = scipy.sparse.linalg.gmres(LA, y, x0=y, callback=call)
print('Solving key linear system... Done')
return d, info
得到 之后,对query=[x]求所有元素与之的SimRank估计值:
global w
def getSimrank(W, d, x, num_items=20):
#get simrank of querys
n = W.shape[0]
D = scipy.sparse.spdiags(d, 0, n, n)
s = D.dot(x)
for i in range(num_items):
wx = W.dot(x)
dwx = D.dot(wx)
for k in range(i + 1):
wtdwx = W.T.dot(dwx)
dwx = wtdwx
s = s + dwx
x = wx
return s
以上方法把SimRank矩阵的计算复杂度从削减到 . 其中预计算的 阵估计 计算复杂度为 . 同时内存开销也得到大幅削减。
参考
- ^Mitsuru Kusumoto, Takanori Maehara, & Ken-ichi Kawarabayashi. (2014). Scalable similarity search for SimRank. ACM.
- ^Yu, W. , Lin, X. , Zhang, W. , Pei, J. , & Mccann, J. A. . (2019). Simrank*: effective and scalable pairwise similarity search based on graph topology. Vldb Journal, 28(3), 401-426.
- ^Saad, Y. , & Schultz, M. H. . (2006). Gmres: a generalized minimal residual algorithm for solving nonsymmetric linear systems.
- ^Li, C., Han, J., He, G., Jin, X., Sun, Y., Yu, Y., & Wu, T. (2010). Fast computation of SimRank for static and dynamic information networks. extending database technology.
来源:oschina
链接:https://my.oschina.net/u/4403186/blog/4334633