GCN中一个重要的矩阵是邻接矩阵,其中一个重要操作步骤是邻接矩阵标准化,这里介绍两种建立标准化邻接矩阵。
import torch
import numpy as np
impoer scipy.sparse as sp
def normalize_adj(adj):
adj = adj.to_dense().cpu().numpy()
adj = sp.coo_matrix(adj) #构建张量
rowsum = np.array(adj.sum(1))#每行的数加在一起
d_inv_sqrt = np.power(rowsum, -0.5).flatten() #输出rowsum ** -1/2
d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0. #溢出部分赋值为0
d_mat_inv_sqrt = sp.diags(d_inv_sqrt) #对角化
adj = adj.dot(d_mat_inv_sqrt).transpose().dot(d_mat_inv_sqrt).tocoo() #转置后相乘
return torch.FloatTensor(adj.todense()).cuda()
第二种方法是利用torch来构建标准化邻接矩阵:
import torch
import numpy as np
impoer scipy.sparse as sp
def normalize_adj_torch(mx):
mx = mx.to_dense() #构建张量
rowsum = mx.sum(1) #每行的数加在一起
r_inv_sqrt = torch.pow