Task 01 简单图论与环境配置与PyG库

图的表示

图的定义

  • 一个图可以表示为 G = { V , ϵ } G=\{V,\epsilon\} G={V,ϵ},其中 V V V是点的集合, ϵ \epsilon ϵ是边的集合。
  • 节点和边可以是类别型的(categorical,信息为label),可以是数值型的(numeric,信息为attribute)
  • 无向图/有向图;无权图/有权图

图的属性

  • 节点的degree d ( v i ) d(v_i) d(vi) ;入度: d i n ( v i ) d_{in}(v_i) din(vi);出度: d o u t ( v i ) d_{out}(v_i) dout(vi)
  • 邻接结点(neighbors): N ( v i ) N(v_i) N(vi):与节点 v i v_i 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出发,经过四条边,到达节点 v 2 v_2 v2.
  • 路径是结点不可重复的行走
  • 连通分量/连通图/最短路径
  • 拉普拉斯矩阵 L = D − A L=D-A L=DA
  • 规范化拉普拉斯矩阵 L = D − 1 2 ( D − A ) D − 1 2 L=D^{-\frac{1}{2}}(D-A)D^{-\frac{1}{2}} L=D21(DA)D21

PyG库

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
  • 通常,一个图至少包含x, edge_index, edge_attr, y, num_nodes5个属性,当图包含其他属性时,我们可以通过指定额外的参数使Data对象包含其他的属性:
graph = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y, num_nodes=num_nodes, other_attr=other_attr)
  • 我们也可以将一个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)

Dataset类:图数据集的表示和使用

  • PyG有很多内置的数据集,在第一次生成PyG内置的数据集时,程序首先下载原始文件,然后将原始文件处理成包含Data对象的Dataset对象并保存到文件。
  • 生成数据集对象并分析数据集
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='/dataset/Cora', name='Cora')
len(dataset) #1
dataset.num_classes #7
dataset.num_node_features #1433
  • 节点分类数据集在训练过程中的使用
model = Net().to(device)
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()

作业

Q:请通过继承Data类实现一个类,专门用于表示“机构-作者-论文”的网络。该网络包含“机构“、”作者“和”论文”三类节点,以及“作者-机构“和“作者-论文“两类边。对要实现的类的要求:1)用不同的属性存储不同节点的属性;2)用不同的属性存储不同的边(边没有属性);3)逐一实现获取不同节点数量的方法。

class Data(object):

    def __init__(self, x_O=None, x_A=None, x_P=None, edge_index_OA=None,  edge_index_AP=None, edge_attr_OA=None, edge_attr_AP=None, y=None, **kwargs):
    r"""
    Args:
        x_O (Tensor, optional): Organization节点属性矩阵,大小为`[num_nodes_O, num_node_features_O]
        x_A (Tensor, optional): Author节点属性矩阵,大小为`[num_nodes_A , num_node_features_A ]
        x_P (Tensor, optional): Paper节点属性矩阵,大小为`[num_nodes_P, num_node_features_P]
        edge_index_OA (LongTensor, optional): OA边索引矩阵,大小为`[2, num_edges_OA]`,第0行为尾节点,第1行为头节点,头指向尾
        edge_index_AP (LongTensor, optional): AP边索引矩阵,大小为`[2, num_edges_AP]`,第0行为尾节点,第1行为头节点,头指向尾
        edge_attr_OA (Tensor, optional): OA边属性矩阵,大小为`[num_edges_OA, num_edge_features_OA]`
        edge_attr_AP (Tensor, optional): OA边属性矩阵,大小为`[num_edges_AP, num_edge_features_AP]`
        y (Tensor, optional): 节点或图的标签,任意大小(,其实也可以是边的标签)
	
    """
    self.x_O = x_O
    self.x_A = x_A
    self.x_P = x_P
    self.edge_index_OA = edge_index_OA
    self.edge_index_AP = edge_index_AP
    self.edge_attr_OA = edge_attr_OA
    self.edge_attr_AP = edge_attr_AP
    self.y = y

    for key, item in kwargs.items():
        if key == 'num_nodes':
            self.__num_nodes__ = item
        else:
            self[key] = item
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值