You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:09:01