d_inv_sqrt = np.power(rowsum, -0.5).flatten() d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0.为什么要 将 d_inv_sqrt 中的正无穷或负无穷替换为 0
时间: 2023-12-06 18:42:34 浏览: 112
在计算图中,如果某个节点的输入为无穷大或无穷小,那么该节点的输出也会是无穷大或无穷小。这可能会导致后续计算出现异常,例如 NaN(Not a Number)或 Inf(Infinity)。为了避免这种情况发生,我们通常需要将无穷大或无穷小替换为一个有限的数值,比如0。因此,在代码中将 d_inv_sqrt 中的正无穷或负无穷替换为 0,是为了避免后续计算出现异常。
相关问题
d_inv_sqrt = np.power(rowsum, -0.5).flatten() d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0.
这段代码的作用是计算一个矩阵的每一行的元素之和的倒数的平方根。具体来说:
- rowsum 是一个一维数组,表示矩阵的每一行的元素之和。
- np.power(rowsum, -0.5) 对 rowsum 中的每个元素取 -0.5 次方,相当于计算倒数的平方根。
- .flatten() 将计算结果变成一维数组。
- np.isinf(d_inv_sqrt) 返回一个布尔数组,表示 d_inv_sqrt 中哪些元素是正无穷或负无穷。
- d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0. 将 d_inv_sqrt 中的正无穷或负无穷替换为 0。
最终得到的 d_inv_sqrt 数组就是矩阵每一行的元素之和的倒数的平方根。
def create_laplacian_dict(self): # 拉普拉斯字典 def symmetric_norm_lap(adj): # rowsum = np.array(adj.sum(axis=1)) d_inv_sqrt = np.power(rowsum, -0.5).flatten() d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0 d_mat_inv_sqrt = sp.diags(d_inv_sqrt) norm_adj = d_mat_inv_sqrt.dot(adj).dot(d_mat_inv_sqrt) return norm_adj.tocoo() def random_walk_norm_lap(adj): # 传入邻接矩阵 rowsum = np.array(adj.sum(axis=1)) # 行总和 d_inv = np.power(rowsum, -1.0).flatten() d_inv[np.isinf(d_inv)] = 0 d_mat_inv = sp.diags(d_inv) norm_adj = d_mat_inv.dot(adj) return norm_adj.tocoo() # 归一化的邻接稀疏矩阵 if self.laplacian_type == 'symmetric': # 解释器默认的是random—walk norm_lap_func = symmetric_norm_lap elif self.laplacian_type == 'random-walk': norm_lap_func = random_walk_norm_lap # 拉普拉斯的功能就用这个 else: raise NotImplementedError self.laplacian_dict = {} for r, adj in self.adjacency_dict.items(): self.laplacian_dict[r] = norm_lap_func(adj) A_in = sum(self.laplacian_dict.values()) self.A_in = self.convert_coo2tensor(A_in.tocoo())
可以看出这段代码是用来创建拉普拉斯字典的。其中使用了两种不同的归一化方法,分别是对称归一化和随机游走归一化。如果选择对称归一化,就使用函数symmetric_norm_lap,如果选择随机游走归一化,就使用函数random_walk_norm_lap。然后遍历邻接矩阵字典,对每一个邻接矩阵都进行相应的归一化操作,最后将所有的归一化邻接矩阵相加,得到A_in,并将其转换为张量格式。
阅读全文