Task01:简单图论与环境配置与PyG库

图结构数据

一、图的表示

被记为,是结点的集合,是的集合。

结点构成:结点表示实体,边表示实体间的关系。

结点和边的信息分为两种:

类别型:取值范围为类别,类别型的信息称为标签。

数值型:取值范围为实数,数值型的信息称为属性。

图的邻接矩阵被记为。

表示存在从结点到的边,表示不存在从结点到的边。

无权图:各条边的权重为1。

有权图:其对应的邻接矩阵为,表示从结点到的边的权重。

二、图的属性

结点的度是指和该结点相关联的边的条数 ,记为。

结点的入度是指进入该结点的边的条数,结点的出度是指从该结点出发的边的条数。

邻接结点为与该结点直接相连的结点,记为。

k跳远的邻接结点为该结点要走k步的结点。

是从结点出发,依次经过,到达结点的行走

行走中,结点是运行重复的。

路径是结点不可重复运行的结点。

图的邻接矩阵为,等于从结点到结点的长度为的行走的个数。

连通图,直径为所有结点对之间的最短路径的最小值。

图的邻接矩阵为,拉普拉斯矩阵定义为。

其中。

规范化的拉普拉斯矩阵定义为。

三、图的种类

同质图:只有一种类型的结点和一种类型的边。

异质图:存在多种类型的结点和多种类型的边。

二部图:存在两类结点,只有不同类的结点之间存在边。

四、图结构数据上的机器学习

五、应用神经网络于图面临的挑战

深度学习应用中,规则的结构化的数据形式有:矩阵向量序列时间序列

图是非规则的非结构化的数据。特点有:

任意的大小和复杂的拓扑结构;没有固定的结点排序或参考点;

通常为动态,具有多模态的特征;图的信息蕴含在结点信息和边的信息图的拓扑结构。

应用于图数据的神经网络,要求:

用于不同度的节点

节点表征的计算与邻接节点的排序无关

不但能够根据节点信息、邻接节点的信息和边的信息计算节点表征,还能根据图拓扑结构计算节点表征



环境配置与PyG库

一、环境配置

使用nvidia-smi命令查询显卡驱动是否正确安装

安装正确版本的pytorchcudatoolkit

安装正确版本的PyG

二、Data类——PyG中图的表示及其使用

Data对象的创建——通过构造函数

def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs)

x: 节点属性矩阵; edge_index : 边索引矩阵;

edge_attr : 边属性矩阵;y: 节点或图的标签

一个图至少包含x, edge_index, edge_attr, y, num_nodes5个属性,可以通过指定额外的参数包含其他的属性

graph = Data(x=x, edge_index=edge_index, edge_attr=edge_attr,y=y,num_nodes=num_nodes, other_attr=other_attr)

Data对象的创建——转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)

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

Data对象的其他性质

from torch_geometric.datasets import KarateClub

dataset = KarateClub()

data = dataset[0]

print(data)

# 获取图的一些信息

print(f'Number of nodes: {data.num_nodes}') # 节点数量

print(f'Number of edges: {data.num_edges}') # 边数量

print(f'Number of node features: {data.num_node_features}') # 节点属性的维度

print(f'Number of node features: {data.num_features}') # 同样是节点属性的维度

print(f'Number of edge features: {data.num_edge_features}') # 边属性的维度

print(f'Average node degree: {data.num_edges / data.num_nodes:.2f}') # 平均节点度

print(f'if edge indices are ordered and do not contain duplicate entries.: {data.is_coalesced()}') # 是否边是有序的同时不含有重复的边

print(f'Number of training nodes: {data.train_mask.sum()}') # 用作训练集的节点

print(f'Training node label rate: {int(data.train_mask.sum()) / data.num_nodes:.2f}') # 用作训练集的节点的数量

print(f'Contains isolated nodes: {data.contains_isolated_nodes()}') # 此图是否包含孤立的节点

print(f'Contains self-loops: {data.contains_self_loops()}')  # 此图是否包含自环的边

print(f'Is undirected: {data.is_undirected()}')  # 此图是否是无向图

运行得到如下结果:

图的各种特征信息。

三、Dataset类——PyG中图数据集的表示及其使用

生成数据集对象并分析数据集

修改torch_geometric.datasets中planetoid.py的代码url

github.com路径改为gitee.com路径

from torch_geometric.datasetsimport Planetoid

dataset = Planetoid(root='/dataset/Cora',name='Cora')

print(dataset)

print(len(dataset))

print(dataset.num_classes)

print(dataset.num_node_features)

运行得到如下结果:

Cora数据集有1个图,7个分类任务,结点的属性维度为1433。

分析数据集中样本

from torch_geometric.datasetsimport Planetoid

dataset = Planetoid(root='/dataset/Cora',name='Cora')

data = dataset[0]

print(data)

print(data.is_undirected())

print(data.train_mask.sum().item())

print(data.val_mask.sum().item())

print(data.test_mask.sum().item())

运行得到如下结果:

Cora数据集有1个图,有2708个结点,结点特征为1433维,有10556条边,有140个用作训练集的结点,有500个用作验证集的结点,有1000个用作测试集的结点。

作业

请通过继承Data类实现一个类,专门用于表示“机构-作者-论文”的网络。

该网络包含“机构“、”作者“和”论文”三类节点,以及“作者-机构“和“作者-论文“两类边。

对要实现的类的要求:

1)用不同的属性存储不同节点的属性;

2)用不同的属性存储不同的边(边没有属性);

3)逐一实现获取不同节点数量的方法。

from torch_geometric.dataimport Data

class iData(Data):

         def __init__(self, institution_x=None, author_x=None, paper_x=None,

                             work_edge_index=None, public_edge_index=None, **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.public_edge_index = public_edge_index

         def num_nodes_institution(self):

                    return self.institution_x.shape[0]

         def num_nodes_author(self):

                    return self.author_x.shape[0]

         def num_nodes_author(self):

                    return self.paper_x.shape[0]



DataWhale开源学习资料:

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

你可能感兴趣的:(Task01:简单图论与环境配置与PyG库)