图神经网络——简单图论与环境配置与PyG库

图结构数据

图的表示

  • 定义一(图):一个图被记为 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},其中 V = { v 1 , … , v N } \mathcal{V}=\left\{v_{1}, \ldots, v_{N}\right\} V={v1,,vN}是数量为 N = ∣ V ∣ N=|\mathcal{V}| N=V 的结点的集合, E = { e 1 , … , e M } \mathcal{E}=\left\{e_{1}, \ldots, e_{M}\right\} E={e1,,eM} 是数量为 M M M 的边的集合。

  • 定义二(图的邻接矩阵):给定一个图 G = { V , E } \mathcal{G}=\{\mathcal{V}, \mathcal{E}\} G={V,E},其对应的邻接矩阵被记为 A ∈ { 0 , 1 } N × N \mathbf{A} \in\{0,1\}^{N \times N} A{0,1}N×N A i , j = 1 \mathbf{A}_{i, j}=1 Ai,j=1表示存在从结点 v i v_i vi v j v_j vj的边,反之表示不存在从结点 v i v_i vi v j v_j vj的边。

图的属性

  • 定义三(结点的度):对于有向有权图,结点 v i v_i vi的出度(out degree)等于从 v i v_i vi出发的边的权重之和,结点 v i v_i vi的入度(in degree)等于从连向 v i v_i vi的边的权重之和。
  • 定义四(邻接结点):结点 v i v_i vi的邻接结点为与结点 v i v_i vi直接相连的结点,其被记为 N ( v i ) \mathcal{N(v_i)} N(vi)
  • 定义五(行走,walk): w a l k ( v 1 , v 2 ) = ( v 1 , e 6 , e 5 , e 4 , e 1 , v 2 ) walk(v_1, v_2) = (v_1, e_6,e_5,e_4,e_1,v_2) walk(v1,v2)=(v1,e6,e5,e4,e1,v2),这是一次“行走”,它是一次从节点 v 1 v_1 v1出发,依次经过边 e 6 , e 5 , e 4 , e 1 e_6,e_5,e_4,e_1 e6,e5,e4,e1,最终到达节点 v 2 v_2 v2的“行走”。
  • 定义六(路径):“路径”是结点不可重复的“行走”。
  • 定义七(子图):有一图 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的子图。
  • 定义八(连通分量):给定图 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的连通分量。
  • 定义九(连通图):当一个图只包含一个连通分量,即其自身,那么该图是一个连通图。
  • 定义十(最短路径): 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的长度。
  • 定义十一(直径):给定一个连通图 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

  • 定义十二(拉普拉斯矩阵):给定一个图 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))
  • 定义十三(对称归一化的拉普拉斯矩阵):给定一个图 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

图的种类

  • 同质图(Homogeneous Graph):只有一种类型的节点和一种类型的边的图。
  • 异质图(Heterogeneous Graph):存在多种类型的节点和多种类型的边的图。
  • 二部图(Bipartite Graphs):节点分为两类,只有不同类的节点之间存在边。

环境配置与PyG中图与图数据集的表示和使用

PyG中图与图数据集的表示和使用

  1. data类的构造函数
class Data(object):

    def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs):
	    r"""
	    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 = x
    self.edge_index = edge_index
    self.edge_attr = edge_attr
    self.y = y

    for key, item in kwargs.items():
        if key == 'num_nodes':
            self.__num_nodes__ = item
        else:
            self[key] = item
#############包含其他属性时################
graph = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y, num_nodes=num_nodes, other_attr=other_attr)
  1. dict对象转换为data对象
graph_dict = {
    'x': x,
    'edge_index': edge_index,
    'edge_attr': edge_attr,
    'y': y,
    'num_nodes': num_nodes,
    'other_attr': other_attr
}
graph_data = Data.from_dict(graph_dict)
  1. data对象转换为其他类型数据
##转换为dict
def to_dict(self):
    return {key: item for key, item in self}
##转换为nametuple
def to_namedtuple(self):
    keys = self.keys
    DataTuple = collections.namedtuple('DataTuple', keys)
    return DataTuple(*[self[key] for key in keys]) 
  1. data对象属性操作
##获取data对象属性
x = graph_data['x']
##设置data对象属性
graph_data['x'] = x
##获取data对象包含属性的关键字
graph_data.keys()
##对边排序并移除重复的边
graph_data.coalesce()
  1. 作业
import torch_geometric


class homeworkData(torch_geometric.data.Data):
    def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs):
        super().__init__(x=x, edge_index=edge_index, edge_attr=None, y=y, **kwargs)
        
        self.x_pap = x[0]
        self.x_aut = x[1]
        self.x_dep = x[2]
        self.edge_index_dep2aut = edge_index[0]
        self.edge_index_aut2pap = edge_index[1]
        self.edge_attr_dep2aut = edge_attr[0]
        self.edge_attr_aut2pap = edge_attr[1]
        self.y = y  

参考资料:

https://github.com/datawhalechina/team-learning-nlp/tree

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值