2021-06-17

本文回顾了图论的基础概念,如节点属性、有向图与无向图、路径与子图,并介绍了图神经网络中常用的图属性,如度、连通分量、最短路径与拉普拉斯矩阵。同时,文章提供了PyG库的安装指南,并演示了一个自定义Data类的例子,用于表示包含机构、作者与论文节点的复杂网络。

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} VV E ′ ∈ E \mathcal{E}^{\prime} \in \mathcal{E} EE并且 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,vtV 是图 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,vtV之间所有路径的集合记为 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=argpPstminp
    其中, 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,vtVmaxpPstminp

10.拉普拉斯矩阵:

  • 给定一个图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},其邻接矩阵为 A A A,其拉普拉斯矩阵定义为 L = D − A \mathbf{L=D-A} L=DA,其中 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=D21(DA)D21=ID21AD21

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]   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值