Task01 简单图论与PyG库

1.GNN学习资源:

2.简单图论与复杂网络

2.1 复杂网络模型

  • 随机网
  • 世界网
  • 无标度网

2.2图论中的基本概念(这里不赘述,只记录比较重要的概念)

  • 行走

  • 路径

  • 最短路径: 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=argminpPstp

  • 连通分量

  • 连通图

  • 直径: 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)=maxvs,vtVminpPstp

  • 拉普拉斯矩阵(Laplacian Matrix):

    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))

  • 对称归一化的拉普拉斯矩阵: 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

2.3 图的种类:

  • 同质图(Homogeneous Graph):只有一种类型的节点和一种类型的边的图。

  • 异质图(Heterogeneous Graph):存在多种类型的节点和多种类型的边的图。

  • 二部图(Bipartite Graphs):节点分为两类,只有不同类的节点之间存在边。

2.4图结构上的机器学习

主要分为三个级别

  • 结点级别和边级别

    • 节点预测:预测节点的类别或某类属性的取值(eg: 对是否是潜在客户分类、对游戏玩家的消费能力做预测)
    • 边预测:预测两个节点间是否存在链接(eg: Knowledge graph completion、好友推荐、商品推荐)
  • 社区(子图)级别

    • 节点聚类:检测节点是否形成 一个社区(社交圈检测)
  • 图级别

    • 图生成:例如药物发现
    • 图演变:例如物理模拟

2.5为什么在图上应用机器学习?

  • 规格化数据的形式: 矩阵、张量、序列(sequence)和时间序列(time series)

  • 非结构化数据(图数据):

    • 任意大小、拓扑结构复杂
    • 没有固定结点排序或参考点
    • 动态、多模态
    • 不只有节点信息和边的信息还包括图的拓扑结构
  • 现实世界的数据大多数都非结构化的数据(不像图像和文本等结构化数据各个点之间服从独立同分布),现实世界的数据各个点之间的联系可能非常紧密

3.环境配置与PyG库

3.1环境配置

  • python -c命令:可以在命令行中执行 python 代码
$ python -c "import torch; print(torch.__version__)"
# 1.8.1
$ python -c "import torch; print(torch.version.cuda)"
# 11.1
  • 安装PyG库时版本一定要对应(否则各种错误层出不穷)

    • 我本机的环境:pytorch1.8.0、cuda10.2

    • 安装方法:

      pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.8.0+cu102.html
      pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.8.0+cu102.html
      pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.8.0+cu102.html
      pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.8.0+cu102.html
      pip install torch-geometric
      

3.2 Data类

3.2.1 Data对象的创建
# 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
  • 一个图至少包含以下5个属性:

    • x, edge_index, edge_attr, y, num_nodes
  • *args:

    • 表示任何多个无名参数,它是一个tuple
  • **kwargs:

    • 表示关键字参数,它是一个dict

3.2.2 Data对象的类型转换

  • dict对象转为Data对象:

    • from_dict: 类方法

      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)
      
  • Data对象转换成其他类型数据

    • Data对象转换为dict对象

      def to_dict(self):
          return {key: item for key, item in self}
      
    • Data对象转换为转换为namedtuple

      def to_namedtuple(self):
          keys = self.keys
          DataTuple = collections.namedtuple('DataTuple', keys)
          return DataTuple(*[self[key] for key in keys])
      

3.3 Dataset类

  • 生成数据集(内置数据集)
  • 数据集的划分:
    • 训练集: train_mask
    • 验证集:val_mask
    • 测试集:test_mask
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='./dataset/Cora', name='Cora')  #注意这里改为./(当前目录)
data = dataset[0]

model = Net().to(device)  # Net为自己定义的模型
data = dataset[0].to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

model.train()  # 训练
for epoch in range(200):
    optimizer.zero_grad()
    out = model(data)
    loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
    loss.backward()
    optimizer.step()

4.作业

4.1作业描述

请通过继承Data类实现一个类,专门用于表示“机构-作者-论文”的网络。该网络包含“机构“、”作者“和”论文”三类节点,以及“作者-机构“和“作者-论文“两类边。对要实现的类的要求:

  • 用不同的属性存储不同节点的属性
  • 用不同的属性存储不同的边(边没有属性)
  • 逐一实现获取不同节点数量的方法

4.2题解

class MyData(Data):
    def __init__(self, institution_x, author_x, paper_x, work_edge_index, publish_edge_index, work_edge_attr, publish_edge_attr, y, **kwargs):
        super().__init__(**kwargs)
        
        self.institution_x = institution_x
        self.author_x = author_x
        self.paper_x = paper_x
        self.work_edge_index = work_edge_index
        self.publish_edge_index = publish_edge_index
        self.work_edge_attr = work_edge_attr
        self.publish_edge_attr = publish_edge_attr
        self.y = y
        
    @property
    def num_nodes_institution(self):
        return self.institution_x.shape[0]
    
    @property
    def num_nodes_author(self):
        return self.author_x.shape[0]
        
    @property
    def num_nodes_paper(self):
        return self.paper_x.shape[0]

5. 参考资料

  • DataWhale开源学习资料:https://github.com/datawhalechina/team-learning-nlp/tree/master/GNN

  • PyG官方文档:https://pytorch-geometric.readthedocs.io/en/latest/index.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值