使用 PyTorch Geometric 和 GCTConv实现异构图、二部图上的节点分类或者链路预测

本文演示了如何利用PyTorchGeometric库中的HGTConv层在二部图上实现异构图的节点分类。首先定义了不同类型的节点特征和边索引,接着创建了异构图数据对象,并应用HGTConv进行特征变换,最后展示了处理后节点特征的输出形状。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决问题描述

使用 PyTorch Geometric 和 Heterogeneous Graph Transformer 实现异构图上的节点分类
在二部图上应用GTN算法(使用torch_geometric的库HGTConv);

步骤解释

  1. 导入所需的 PyTorch 和 PyTorch Geometric 库。

  2. 定义 x1 和 x2 两种不同类型节点的特征,分别有 1000 个和 500 个节点,每个节点有两维特征。
    随机生成两种边 e1 和 e2 的索引(edge index)和权重(edge weight),其中 e1 从 n1 到 n2,e2 从 n2 到 n1。

  3. 定义异构图的元数据字典 meta_dict,其中 ‘n1’ 和 ‘n2’ 分别表示两种节点类型,而 (‘n1’, ‘e1’, ‘n2’) 表示从类型 ‘n1’ 的节点到类型 ‘n2’ 的节点有一条边,这条边的索引和权重分别为 edge_index_e1 和 edge_weight_e1。

  4. 利用元数据字典 meta_dict 创建异构图数据对象 data,并将节点特征和边索引添加到该对象中。

  5. 定义异构元数据列表 meta_list,其中包含所有节点类型和边类型的名称信息。

  6. 定义 HGTConv 层,并指定输入通道数、输出通道数、异构元数据列表以及头数等超参数。

  7. 将节点特征和边索引转换为字典形式,并利用 HGTConv

  8. 应用 HGTConv 到输入数据,得到输出结果 output_dict,其中包含了处理后的节点特征。最后打印输出 n1 和 n2 节点的输出形状。

详细代码

以下代码可以直接运行

import torch
from torch_geometric.data import Data, HeteroData
from torch_geometric.utils import add_self_loops
from torch_geometric.nn import HGTConv

# 定义节点特征
x1 = torch.randn(1000, 2)
x2 = torch.randn(500, 2)

# 定义边索引(edge index)以及边权重(edge weight)
edge_index_e1 = torch.cat((torch.randint(0, 1000, size=(1, 4000)),torch.randint(0, 500, size=(1, 4000))),dim=0)
edge_weight_e1 = torch.rand(4000)
edge_index_e2=torch.flip(edge_index_e1, (0,))

# 定义元数据字典,描述异构图的结构
meta_dict = {
    'n1': {'num_nodes': x1.shape[0], 'num_features': x1.shape[1]},
    'n2': {'num_nodes': x2.shape[0], 'num_features': x2.shape[1]},
    ('n1', 'e1', 'n2'): {'edge_index': edge_index_e1, 'edge_weight': edge_weight_e1},
}

# 创建异构图数据对象
data = HeteroData(meta_dict)

# 将节点特征和边索引添加到异构图对象中
data['n1'].x = x1
data['n2'].x = x2
data[('n1', 'e1', 'n2')].edge_index = edge_index_e1
data[('n2', 'e1', 'n1')].edge_index = edge_index_e2

# 定义异构元数据列表
meta_list= (['n1', 'n2'], [('n1', 'e1', 'n2'), ('n2', 'e1', 'n1')])

# 定义 HGTConv 层
in_channels = {
    'n1': x1.shape[1],
    'n2': x2.shape[1],
}
out_channels = 16
heads = 4
conv = HGTConv(in_channels=in_channels, out_channels=out_channels, metadata=meta_list,heads=heads)

# 将输入数据转换为字典形式
x_dict = {ntype: data[ntype].x for ntype in data.node_types}
edge_index_dict = {}
for etype in data.edge_types:
    edge_index_dict[etype] = data[etype].edge_index

# 应用 HGTConv 到输入数据
output_dict = conv(x_dict, edge_index_dict)
print(output_dict['n1'].shape)
print(output_dict['n2'].shape)

之后如果是节点分类则:

output_dict的n1,n2特征编码分别接全连接层对应y1,y2

之后如果是链路预测则:

output_dict的n1,n2特征编码按照链路进行合并,进而预测

一些细节

data = HeteroData(meta_dict) 创建异构图对象
edge_index_e2=torch.flip(edge_index_e1, (0,)) 创建逆向的边,由于是二部图无向图所以需要

### 图神经网络二部图中的应用实现方法 #### 1. 二部图的定义与特性 二部图(Bipartite Graph)是一种特殊的图结构,其中节点可以分为两个互不相交的集合 \( U \) \( V \),且所有边都连接一个来自 \( U \) 的节点一个来自 \( V \) 的节点[^3]。这种结构广泛存在于推荐系统、协同过滤等领域,例如用户-商品关系图。 #### 2. 图神经网络二部图中的应用 图神经网络(GNN)能够直接处理图结构数据,因此在二部图中也有广泛应用。以下是几个主要应用场景: - **推荐系统**: 在推荐系统中,二部图通常表示用户商品之间的交互关系。通过 GNN 模型,可以从用户商品的特征中学习到更深层次的关系表示[^2]。例如,GraphSAGE 是一种成功的 GNN 方法,它通过聚合邻居节点的信息来生成节点嵌入向量,从而更好地捕捉用户商品之间的关联性。 - **协同过滤**: 协同过滤是推荐系统的核心技术之一,而基于二部图的 GNN 可以有效建模用户商品之间的隐式关系。通过将用户商品作为二部图的两个节点集,GNN 能够学习到每个节点的低维表示,并进一步用于预测用户对未见过的商品的兴趣[^4]。 - **知识图谱补全**: 在某些情况下,二部图可以被用来表示实体属性之间的关系。通过 GNN 模型,可以学习到这些关系的潜在表示,从而用于知识图谱补全任务[^1]。 #### 3. 图神经网络二部图中的实现方法 为了在二部图中应用 GNN,需要考虑其特殊结构。以下是几种常见的实现方法: - **消息传递机制**: GNN 的核心思想是通过消息传递机制来更新节点表示。对于二部图,可以通过分别聚合来自 \( U \) \( V \) 集合的邻居信息来更新节点表示。具体公式如下: ```python h_u^{(l+1)} = AGGREGATE(\{h_v^{(l)} : (u, v) \in E\}) h_v^{(l+1)} = AGGREGATE(\{h_u^{(l)} : (u, v) \in E\}) ``` 其中 \( h_u^{(l)} \) \( h_v^{(l)} \) 分别表示第 \( l \) 层中节点 \( u \) \( v \) 的表示[^1]。 - **异构图神经网络**: 对于二部图,可以将其视为一种简单的异构图。在这种情况下,可以使用异构图神经网络(Heterogeneous Graph Neural Network, HGN)来建模不同类型的节点边。HGN 通常会为每种类型的节点边设计特定的消息传递函数。 - **Transformer 与 GNN 的融合**: 在某些复杂场景下,可以结合 Transformer GNN 来增强模型的表达能力。例如,通过自注意力机制捕获节点之间的全局依赖关系,同时利用 GNN 建模局部结构信息[^4]。 #### 4. 实现示例 以下是一个简单的 PyTorch 实现示例,展示如何在二部图中应用 GNN: ```python import torch import torch.nn as nn import torch.nn.functional as F from dgl.nn import SAGEConv class BipartiteGNN(nn.Module): def __init__(self, in_feats, hidden_size, out_feats): super(BipartiteGNN, self).__init__() self.conv1 = SAGEConv(in_feats, hidden_size, aggregator_type='mean') self.conv2 = SAGEConv(hidden_size, out_feats, aggregator_type='mean') def forward(self, graph, features): h = F.relu(self.conv1(graph, features)) h = self.conv2(graph, h) return h # 创建二部图并初始化节点特征 import dgl import numpy as np u_nodes = torch.tensor([0, 1, 2]) v_nodes = torch.tensor([3, 4, 5]) edges = (torch.tensor([0, 1, 2]), torch.tensor([3, 4, 5])) bipartite_graph = dgl.heterograph({('user', 'interacts', 'item'): edges}) features = torch.randn(bipartite_graph.num_nodes(), 10) # 初始化模型并进行前向传播 model = BipartiteGNN(in_feats=10, hidden_size=16, out_feats=8) output = model(bipartite_graph, features) print(output) ``` #### 5. 总结 图神经网络二部图中的应用主要包括推荐系统、协同过滤知识图谱补全等任务。其实现方法通常基于消息传递机制或异构图神经网络,同时可以结合 Transformer 提升模型性能[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_刘文凯_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值