def _calculate_random_walk_laplacian(self, adj):
adj = sp.coo_matrix(adj)
d = np.array(adj.sum(1))
isolated_point_num = np.sum(np.where(d, 0, 1))
d_inv = np.power(d, -1).flatten()
d_inv[np.isinf(d_inv)] = 0.
d_mat_inv = sp.diags(d_inv)
random_walk_mx = sp.eye(adj.shape[0]) - d_mat_inv.dot(adj).tocoo()
return random_walk_mx, isolated_point_num
这段代码定义了一个方法 _calculate_random_walk_laplacian
,用于计算给定邻接矩阵的随机游走拉普拉斯矩阵(Random Walk Laplacian),并计算孤立点的数量。
def _calculate_random_walk_laplacian(self, adj):
定义了一个方法 _calculate_random_walk_laplacian
,接收一个参数 adj
,表示邻接矩阵。
adj = sp.coo_matrix(adj)
将邻接矩阵 adj
转换为 SciPy 的 COO(Coordinate list)格式的稀疏矩阵。这种格式适合存储稀疏矩阵,并在计算中具有高效性。
d = np.array(adj.sum(1))
计算每个节点的度(degree),即每行的元素和。生成一个一维的 NumPy 数组 d
,其中每个元素表示对应节点的度。
isolated_point_num = np.sum(np.where(d, 0, 1))
计算孤立点的数量。np.where(d, 0, 1)
生成一个布尔数组,对于度为零的节点,数组值为 1;否则为 0。np.sum
计算这些值的总和,从而得到孤立点的数量。
d_inv = np.power(d, -1).flatten()
计算度的逆(inverse),即 d
中每个元素的倒数。np.power(d, -1)
计算度的逆,flatten()
将其转换为一维数组。对于度为零的节点,这里会得到无穷大值。
d_inv[np.isinf(d_inv)] = 0.
将逆中的无穷大值(由度为零的节点产生)设置为零,以避免在后续计算中出现无穷大或 NaN 值。
d_mat_inv = sp.diags(d_inv)
创建一个对角矩阵 d_mat_inv
,其对角元素为 d_inv
。这个对角矩阵将用于计算随机游走拉普拉斯矩阵。
random_walk_mx = sp.eye(adj.shape[0]) - d_mat_inv.dot(adj).tocoo()
计算随机游走拉普拉斯矩阵。具体步骤如下:
sp.eye(adj.shape[0])
创建一个单位矩阵,大小与邻接矩阵相同。d_mat_inv.dot(adj)
计算逆度对角矩阵与邻接矩阵的乘积。.tocoo()
将结果转换为 COO 格式的稀疏矩阵。
return random_walk_mx, isolated_point_num
返回计算得到的随机游走拉普拉斯矩阵 random_walk_mx
和孤立点数量 isolated_point_num
。