【图与推荐】往期回顾:
本文介绍:图与推荐[3] - Link Predict
从以下几个方面介绍:
(1)Geometry 的 loader.dataset 介绍
(2)链接预测样本集构造
(3)代码实现 链接预测 (不实现也希望能够将框架写出来)
1.1 Pytorch Geometric
参考链接:图神经网络 PyTorch Geometric 入门教程
PyTorch Geometric Library (简称 PyG) 是一个基于 PyTorch 的图神经网络库,地址是:https://github.com/rusty1s/pytorch_geometric。它包含了很多 GNN 相关论文中的方法实现和常用数据集,并且提供了简单易用的接口来生成图,因此对于复现论文来说也是相当方便。用法大多数和 PyTorch 很相近,因此熟悉 PyTorch 的同学使用这个库可以很快上手。
torch_geometric.data.Data
节点和节点之间的边构成了图。所以在 PyG 中,如果你要构建图,那么需要两个要素:节点和边。PyG 提供了torch_geometric.data.Data (下面简称Data) 用于构建图,包括 5 个属性,每一个属性都不是必须的,可以为空。
- x: 用于存储每个节点的特征,形状是[num_nodes, num_node_features]。
- edge_index: 用于存储节点之间的边,形状是 [2, num_edges]。
- pos: 存储节点的坐标,形状是[num_nodes, num_dimensions]。
- y: 存储样本标签。如果是每个节点都有标签,那么形状是[num_nodes, *];如果是整张图只有一个标签,那么形状是[1, *]。
- edge_attr: 存储边的特征。形状是[num_edges, num_edge_features]。
[node_attr] 存储到 node 节点的embedding 表示
[edge_index] 用于 node 的稀疏存储
[edge_attr] 用于存储边的特征向量
import torch
from torch_geometric.data import Data
edge_index=torch.tensor(
[[0,0,0,1,2,2,3,3],
[1,2,3,0,0,3,0,2]],dtype=torch.long
)
node_attr=torch.tensor(
[[-1,1,2],[1,1,1],[0,1,2],[3,1,2]]
)
edge_attr=torch.tensor(
[[0,0,0],[0,1,2],[0,3,3],[0,0,0],[0,0,2],[0,2,3],[0,3,3],[0,2,3]]
)
data=Data(x=node_attr,edge_index=edge_index,edge_attr=edge_attr)
print(data)
# Data(edge_attr=[8, 3], edge_index=[2, 8], x=[4, 3])
Dataset 与 DataLoader
PyG 的 Dataset继承自torch.utils.data.Dataset.
(1) Dataset
尽管 PyG 已经包含许多有用的数据集,我们也可以通过继承torch_geometric.data.Dataset使用自己的数据集。提供 2 种不同的Dataset:
- InMemoryDataset:使用这个Dataset会一次性把数据全部加载到内存中。
- Dataset: 使用这个Dataset每次加载一个数据到内存中,比较常用。
参考:使用Pytorch Geometric建立自己的数据集
(2) DataLoader
通过torch_geometric.data.DataLoader可以方便地使用 mini-batch。
train_loader = DataLoader(train_graphs, batch_size=args.batch_size, shuffle=True)
val_loader = DataLoader(val_graphs, batch_size=args.batch_size, shuffle=True)
test_loader = DataLoader(test_graphs, batch_size=args.batch_size, shuffle=False)
train_graphs、val_graphs、test_graphs的形成如下面代码所示,先定义一个列表,然后通过minus_edge()或者plus_edge() 得到一个 torch_geometric.data.Data 格式的数据样本,并且append到这个列表中。
...
train_graphs = []
val_graphs = []
test_graphs = []
# train_graph
for i in range(data.train_pos.size(1)):
train_graphs.append(minus_edge(data_observed, 1, data.train_pos[:, i], args))
for i in range(data.train_neg.size(1)):
train_graphs.append(plus_edge(data_observed, 0, data.train_neg[:, i], args))
下面来看看train_loader的样式:
1.2 Link Predition 样本集构造
1.3 Pytorch 实现
链接预测方法:
-
通过节点标签对相关拓扑信息进行编码。
-
通过建立子图分类处理链接预测。
GCN 两阶段预测:
- (1) 首先是设计一个仅依赖于定义链接的两个节点的评分函数。
- (2) 围绕结点链接提取子图,并通过(子)图分类解决链接预测(Zhang & Chen,2017)。
在这两种情况下,节点表示要么以无监督方式学习(Kipf & Welling, 2016b; Mavromatis & Karypis, 2020),要么由与链接分类器联合训练的 GNN 计算(Zhang & Chen, 2018; Zhang et al., 2020 )