DataWhale - 六月组队学习-图神经网络
Task 1: 简单图论与PyG的简单事件
参考资料:DataWhale开源课程
我之前学过图论和Graph Embedding相关内容,当时做项目赶鸭子上架,基本是看了一些知乎文章了解算法的大概原理,然后调用现成的图算法包完成了项目的一部分,但是由于没有系统地学习过图论和图的定义及属性,现在忘的差不多了。因为有一点基础,所以会简单记录一下以前学过但容易忘的定义和一些定理。
注:第一节内容主要来自"Chapter 2 - Foundations of Graphs, Deep Learning on Graphs",辛苦DataWhale的同学们做了翻译与重新排版,感谢他们。
一、图的定义和定理
1.节点和边的属性:
- 节点和边的信息可以是类别型的(categorical),类别型数据的取值只能是哪一类别。一般称类别型的信息为标签(label)。
- 节点和边的信息可以是数值型的(numeric),数值型数据的取值范围为实数。一般称数值型的信息为属性(attribute)。
- 在图的计算任务中,我们认为,节点一定含有信息(至少含有节点的度的信息),边可能含有信息。
2.有向图与无向图
-
在无向图中,从节点 v i v_i vi到 v j v_j vj的边存在,意味着从节点 v j v_j vj到 v i v_i vi的边也存在。因而无向图的邻接矩阵是对称的。
-
在无权图中,各条边的权重被认为是等价的,即认为各条边的权重为 1 1 1。
-
对于有权图,其对应的邻接矩阵通常被记为 W ∈ { 0 , 1 } N × N \mathbf{W} \in\{0,1\}^{N \times N} W∈{0,1}N×N,其中 W i , j = w i j \mathbf{W}_{i, j}=w_{ij} Wi,j=wij表示从节点 v i v_i vi到 v j v_j vj的边的权重。若边不存在时,边的权重为 0 0 0。
3.节点的度:
- 对于有向有权图,节点 v i v_i vi的出度(out degree)等于从 v i v_i vi出发的边的权重之和,节点 v i v_i vi的入度(in degree)等于从连向 v i v_i vi的边的权重之和。
- 无权图是有权图的特殊情况,各边的权重为 1 1 1,那么节点 v i v_i vi的出度(out degree)等于从 v i v_i vi出发的边的数量,节点 v i v_i vi的入度(in degree)等于从连向 v i v_i vi的边的数量。
4.路径:
- “路径”是节点不可重复的“行走”。
5.子图:
- 有一图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},另有一图 G ′ = { V ′ , E ′ } \mathcal{G}^{\prime}=\{\mathcal{V}^{\prime}, \mathcal{E}^{\prime}\} G′={V′,E′},其中 V ′ ∈ V \mathcal{V}^{\prime} \in \mathcal{V} V′∈V, E ′ ∈ E \mathcal{E}^{\prime} \in \mathcal{E} E′∈E并且 V ′ \mathcal{V}^{\prime} V′不包含 E ′ \mathcal{E}^{\prime} E′中未出现过的节点,那么 G ′ \mathcal{G}^{\prime} G′是 G \mathcal{G} G的子图。
6.连通分量:
- 给定图 G ′ = { V ′ , E ′ } \mathcal{G}^{\prime}=\{\mathcal{V}^{\prime}, \mathcal{E}^{\prime}\} G′={V′,E′}是图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E}的子图。记属于图 G \mathcal{G} G但不属于 G ′ \mathcal{G}^{\prime} G′图的节点集合记为 V / V ′ \mathcal{V}/\mathcal{V}^{\prime} V/V′ 。如果属于 V ′ \mathcal{V}^{\prime} V′的任意节点对之间存在至少一条路径,但不存在一条边连接属于 V ′ \mathcal{V}^{\prime} V′的节点与属于 V / V ′ \mathcal{V}/\mathcal{V}^{\prime} V/V′的节点,那么图 G ′ \mathcal{G}^{\prime} G′是图 G \mathcal{G} G的连通分量。
7.连通图:
- 当一个图只包含一个连通分量,即其自身,那么该图是一个连通图。
8.最短路径:
-
v
s
,
v
t
∈
V
v_{s}, v_{t} \in \mathcal{V}
vs,vt∈V 是图
G
=
{
V
,
E
}
\mathcal{G}=\{\mathcal{V}, \mathcal{E}\}
G={V,E}上的一对节点,节点对
v
s
,
v
t
∈
V
v_{s}, v_{t} \in \mathcal{V}
vs,vt∈V之间所有路径的集合记为
P
s
t
\mathcal{P}_{\mathrm{st}}
Pst。节点对
v
s
,
v
t
v_{s}, v_{t}
vs,vt之间的最短路径
p
s
t
s
p
p_{\mathrm{s} t}^{\mathrm{sp}}
pstsp为
P
s
t
\mathcal{P}_{\mathrm{st}}
Pst中长度最短的一条路径,其形式化定义为
p s t s p = arg min p ∈ P s t ∣ p ∣ p_{\mathrm{s} t}^{\mathrm{sp}}=\arg \min _{p \in \mathcal{P}_{\mathrm{st}}}|p| pstsp=argp∈Pstmin∣p∣
其中, p p p表示 P s t \mathcal{P}_{\mathrm{st}} Pst中的一条路径, ∣ p ∣ |p| ∣p∣是路径 p p p的长度。
9.直径:
- 给定一个连通图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},其直径为其所有节点对之间的最短路径的最大值,形式化定义为
diameter ( G ) = max v s , v t ∈ V min p ∈ P s t ∣ p ∣ \operatorname{diameter}(\mathcal{G})=\max _{v_{s}, v_{t} \in \mathcal{V}} \min _{p \in \mathcal{P}_{s t}}|p| diameter(G)=vs,vt∈Vmaxp∈Pstmin∣p∣
10.拉普拉斯矩阵:
- 给定一个图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},其邻接矩阵为 A A A,其拉普拉斯矩阵定义为 L = D − A \mathbf{L=D-A} L=D−A,其中 D = d i a g ( d ( v 1 ) , ⋯ , d ( v N ) ) \mathbf{D=diag(d(v_1), \cdots, d(v_N))} D=diag(d(v1),⋯,d(vN))。
11.对称归一化的拉普拉斯矩阵:
- 给定一个图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},其邻接矩阵为 A A A,其规范化的拉普拉斯矩阵定义为
L = D − 1 2 ( D − A ) D − 1 2 = I − D − 1 2 A D − 1 2 \mathbf{L=D^{-\frac{1}{2}}(D-A)D^{-\frac{1}{2}}=I-D^{-\frac{1}{2}}AD^{-\frac{1}{2}}} L=D−21(D−A)D−21=I−D−21AD−21
12.图的种类:
- 同质图:只有一种节点和一种边的图
- 异质图:存在多种节点和多种边的图
- 二部图:节点分为两类,只有不同类的节点之间存在边
二、PyG中图的使用
由于我没有GPU版本的电脑,所以直接是在Colab中安装了PyG库,十分便捷,以下是安装代码:
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.8.0+cu111.html
pip install torch-geometric
PyG库的Data类使用说明如下:
torch_geometric.data.Data。
作业:
请通过继承Data类实现一个类,专门用于表示“机构-作者-论文”的网络。该网络包含“机构“、”作者“和”论文”三类节点,以及“作者-机构“和“作者-论文“两类边。对要实现的类的要求:1)用不同的属性存储不同节点的属性;2)用不同的属性存储不同的边(边没有属性);3)逐一实现获取不同节点数量的方法。
class Data(object):
def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs):
"""
Args:
x (Tensor, optional): 节点属性矩阵,大小为`[num_nodes, num_node_features]`
edge_index (LongTensor, optional): 边索引矩阵,大小为`[2, num_edges]`,第0行为尾节点,第1行为头节点,头指向尾
edge_attr (Tensor, optional): 边属性矩阵,大小为`[num_edges, num_edge_features]`
y (Tensor, optional): 节点或图的标签,任意大小(,其实也可以是边的标签)
"""
self.x_ins = x_ins #机构节点
self.x_aut = x_aut #作者节点
self.x_the = x_the #论文节点
self.edge_aut_ins = edge_aut_ins #作者-机构边
self.edge_aut_the = edge_aut_the #作者-论文边
self.y = y
for key, item in kwargs.items():
if key == 'num_nodes':
self.__num_nodes__ = item
else:
self[key] = item
# 返回机构、作者、论文节点的数量
def ins_num(self):
return self.x_ins.shape[0]
def aut_num(self):
return self.x_aut.shape[0]
def the_num(self):
return self.x_the.shape[0]
# 返回作者-机构边、作者-论文边的数量
def ant_ins_edge_num(self):
return self.edge_aut_ins.shape[1]
def ant_ins_edge_num(self):
return self.edge_aut_the.shape[1]
本文回顾了图论的基础概念,如节点属性、有向图与无向图、路径与子图,并介绍了图神经网络中常用的图属性,如度、连通分量、最短路径与拉普拉斯矩阵。同时,文章提供了PyG库的安装指南,并演示了一个自定义Data类的例子,用于表示包含机构、作者与论文节点的复杂网络。
1万+

被折叠的 条评论
为什么被折叠?



