图神经网络学习1

图结构数据
一、图的表示
1、节点(v)、边(e)。节点和边的信息可以是类别型(标签)或数值型(属性)。
2、图的邻接矩阵(A),有(无)向图、有(无)权(W)图
二、图的属性
1、节点的度(d、 d i n d_{in} din d o u t d_{out} dout)、邻接节点( N ( v i ) N(v_i) N(vi))、行走( w a l k ( v 1 , v 2 ) walk(v_1,v_2) walk(v1,v2))、路径
2、定理:邻接矩阵的 n n n次方矩阵的每一个元素表示n步之后行走的个数
3、子图、连通分量、连通图、最短路径
4、直径、 d i a m e t e r ( G ) = max ⁡ v s , v t ∈ V min ⁡ p ∈ P s t ∣ P ∣ diameter(G)=\max_{v_s,v_t\in V}\min_{p\in P_{st}|P|} diameter(G)=maxvs,vtVminpPstP
5、拉普拉斯矩阵 L = D − A L = D - A L=DA,其中
D = d i a g ( d ( v 1 ) , . . . d ( v n ) ) D=diag(d(v_1),...d(v_n)) D=diag(d(v1),...d(vn))
6、定理:对称归一化拉普拉斯矩阵:
L = D − 1 2 ( D − L ) D − 1 2 = I − D − 1 2 A D − 1 2 L=D^{-\frac{1}{2}}(D-L)D^{-\frac{1}{2}}=I-D^{-\frac{1}{2}}AD^{-\frac{1}{2}} L=D21(DL)D21=ID21AD21
三、图的种类
1、同质图、异质图、二部图
四、图数据结构上的机器学习

  1. 节点预测:预测节点的类别或某类属性的取值
    例子:对是否是潜在客户分类、对游戏玩家的消费能力做预测
  2. 边预测:预测两个节点间是否存在链接
    例子:Knowledge graph completion、好友推荐、商品推荐
  3. 图的预测:对不同的图进行分类或预测图的属性
    例子:分子属性预测
  4. 节点聚类:检测节点是否形成一个社区
    例子:社交圈检测
  5. 其他任务
    1. 图生成:例如药物发现
    2. 图演变:例如物理模拟
    3. ……

五、面临的挑战
特点:

  1. 任意的大小和复杂的拓扑结构;
  2. 没有固定的结点排序或参考点;
  3. 通常是动态的,并具有多模态的特征;
  4. 图的信息并非只蕴含在节点信息和边的信息中,图的信息还包括了图的
    拓扑结构。
    要求:
    适用于不同度的节点;
    节点表征的计算与邻接节点的排序无关;
    不但能够根据节点信息、邻接节点的信息和边的信息计算节点表征,还
    能根据图拓扑结构计算节点表征。

环境配置
环境配置的时候就遇到了不少问题,首先要下载pyG相关环境。由于本地的cuda和pytorch环境与教程上的不同,本地cuda=10.2,torch=1.6.0,因为不想改变本地环境,以免和其他程序冲突,看官网上安装教程上说只要把安装命令中的版本号改一下就可以,即
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.6.0+cu102.html
但是出了一堆红色的错误:
在这里插入图片描述

在网上搜了一下说是要升级g++,于是又按照相关教程的方法升级g++。参考网页 CentOS7解决: g++: 错误:unrecognized command line option ‘-std=c++14’_蓝一潇的博客-CSDN博客,依次输入以下命令:
yum install centos-release-scl-rh
yum install centos-release-scl
yum install devtoolset-7-gcc.x86_64
yum install devtoolset-7-gcc-c++.x86_64
scl enable devtoolset-7 bash
在这里插入图片描述

至此,说明-std=c++14安装成功了
然后再重新运行
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.6.0+cu102.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.6.0+cu102.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.6.0+cu102.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.6.0+cu102.html
pip install torch-geometric
环境终于安装成功了

Data类——PyG中图的表示及其使用
通常,Data类包含x, edge_index, edge_attr, y, num_nodes五个参数,意义分别为:
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): 节点或图的标签,任意大小(,其
实也可以是边的标签)
创建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)

Data对象转换成其他类型数据

graph.to_dict()转化成字典类型
graph.to_namedtuple()转化成namedtuple类型

其他函数

graph_data.keys()获取包含属性的关键字
graph_data.coalesce()对边排序并删除重复边

应用:

from torch_geometric.datasets import KarateClub
dataset = KarateClub()
data = dataset[0] # Get the first graph object.
print(data)
print('==============================================================')# 获取图的一些信息
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()}') # 此图是否是无向图
/data/anaconda3/lib/python3.7/site-packages/numba/decorators.py:146: RuntimeWarning: Caching is not available when the 'parallel' target is in use. Caching is now being disabled to allow execution to continue.
  warnings.warn(msg, RuntimeWarning)


Data(edge_index=[2, 156], train_mask=[34], x=[34, 34], y=[34])
==============================================================
Number of nodes: 34
Number of edges: 156
Number of node features:34
Number of node features: 34
Number of edge features:0
Average node degree: 4.59
if edge indices are ordered and do not contain duplicate entries.: True
Number of training nodes:4
Training node label rate:0.12
Contains isolated nodes:False
Contains self-loops:False
Is undirected: True
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='/dataset/Cora', name='Cora')
# Cora()
print(len(dataset))
# 1
print(dataset.num_classes)
# 7
print(dataset.num_node_features)
# 1433
1
7
1433
data = dataset[0]
print(data)
print(data.is_undirected())
# # True
print(data.train_mask.sum().item())
# # 140
print(data.val_mask.sum().item())
# # 500
print(data.test_mask.sum().item())
Data(edge_index=[2, 10556], test_mask=[2708], train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])
True
140
500
1000

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

from torch_geometric.data import Data
import torch
class myData(Data):
    def inst_num(self):        
        return len(torch.where(self.y==0)[0])
    def author_num(self):        
        return len(torch.where(self.y==1)[0])
    def papper_num(self):        
        return len(torch.where(self.y==2)[0])
edge_index = torch.tensor([[0, 1, 1, 2, 3, 4, 4, 5],
                           [1, 0, 2, 1, 4, 3, 5, 4 ]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1],[-1], [0], [1]], dtype=torch.float)
y = torch.tensor([[0], [1], [2],[0],[1],[2]], dtype=torch.int16)

data = myData(x=x, edge_index=edge_index, y=y)

print(f'机构数量:{data.inst_num()}')
print(f'作者数量:{data.author_num()}')
print(f'论文数量:{data.papper_num()}')
机构数量:2
作者数量:2
论文数量:2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值