使用Python将邻接矩阵转换为torch_geometric.data.Data格式及x参数疑问
关于PyG的Data参数x与边权重的区别说明
核心疑问解答
节点特征矩阵x不需要传入边权重矩阵,二者属于完全不同的属性维度:
- 节点特征矩阵
x:形状为[num_nodes, num_node_features],每一行对应一个节点本身的固有属性,和边的连接关系没有直接关联 - 边权重属于边的属性,需要存入
Data的edge_attr参数中,形状要求为[num_edges, num_edge_features],如果只有边权重这一个边特征,调整为[num_edges, 1]的形状即可
邻接矩阵转Data完整实操示例
基于你现有的代码补全实现如下:
import torch import scipy.sparse as scpy from torch_geometric.data import Data # 读取邻接矩阵并转换为CSR格式 adj_np = adjacencyMat_df.iloc[: , 1:].values torch_tensor = torch.tensor(adj_np, dtype=torch.float) A = scpy.csr_matrix(adj_np) # 提取edge_index和边权重 coo_mat = A.tocoo() edge_index = torch.tensor([coo_mat.row, coo_mat.col], dtype=torch.long) # 边权重转为符合edge_attr要求的形状 edge_weight = torch.tensor(coo_mat.data, dtype=torch.float).unsqueeze(1) # 构造节点特征x(以下为两种无额外节点特征时的常用方案二选一) num_nodes = adj_np.shape[0] # 方案1:用单位矩阵作为节点特征,每个节点对应独热编码 x = torch.eye(num_nodes, dtype=torch.float) # 方案2:用节点度作为节点特征 # node_degree = torch.tensor(A.sum(axis=1), dtype=torch.float) # x = node_degree # 生成最终Data对象 data = Data( x=x, edge_index=edge_index, edge_attr=edge_weight )
不同场景的节点特征列含义说明
节点特征的每一列对应节点的一个维度的属性,不同应用场景的特征定义差异较大,常见场景示例如下:
- 社交网络场景:特征维度一般为3~10维,每列分别对应用户年龄、性别编码、月均消费、注册时长、实名认证标识等,多用于节点分类(识别营销号)、链路预测(推荐好友)
- 分子预测场景:特征维度一般为10~20维,每列分别对应原子序数、芳香族标识、连接氢原子数、形式电荷等,多用于图分类(判断分子毒性)
- 交通预测场景:特征维度一般为24维,每列对应路口过去24个小时的平均车流量,多用于节点回归(预测下一小时车流量)
内容的提问来源于stack exchange,提问作者SysEng
相关产品推荐
相关产品推荐

