DGL如何表征一张图

news2024/7/6 18:37:37

有关于DGL中图的构建

DGL 将有向图表示为一个 DGL 图对象。图中的节点编号连续,从0开始。我们一般通过指定图中的节点数,以及源节点和目标节点的列表,来构建这么一个图。

下面的代码构造了一个图,这个图有五个叶子节点。中心节点的 ID 为 0,边从中心节点出发,指向众多的叶子节点。
在这里插入图片描述

g = dgl.graph(([0, 0, 0, 0, 0], [1, 2, 3, 4, 5]), num_nodes=6)
# 同样地,PyTorch LongTensors 也可以使用
g = dgl.graph((torch.LongTensor([0, 0, 0, 0, 0]), torch.LongTensor([1, 2, 3, 4, 5])), num_nodes=6)
# 如果你可以从 edge list 中看出有多少个节点,也可以不制定 nodes 的数量
g = dgl.graph(([0, 0, 0, 0, 0], [1, 2, 3, 4, 5]))

在这个图中,边具有从0开始且连续的ID。并且在创建的过程中,边的顺序和源节点到目标节点列表的顺序相同。换句话说,我们在创建 g 的时候,并不需要特地指定边,而是直接通过起始点列表,也就是 [0, 0, 0, 0, 0] 和 目标点列表 [1, 2, 3, 4, 5] 来自动生成边。

# 打印每条边的源节点和目标节点
print(g.edges())

为图指定节点和边的特征

我们建立的图,往往其边和节点都是有特定的属性的。在现实世界中,图中节点代表的实体可能有多种多样的属性,比如“人”实体可能有性别、年龄、姓名等等属性。
不过在 DGLGraph 中,我们的属性都是张量化的存储的,因此所有的节点或者边的属性都具有相同的维度(shape)
当然我们现在是为了学习图神经网络,所以这里我们就把这些属性称为“特征”。我们可以采用 ndateedata 来给节点(node)和边(edge)赋予特征。

# 为每个节点赋予一个 3维 的特征向量,总共6个节点。
g.ndata['x'] = torch.randn(6, 3)
# 为每条边赋予一个 4维 的特征向量,总共5条节点。
g.edata['a'] = torch.randn(5, 4)
# 为每个节点赋予一个 5x4 的特征矩阵,总共6个节点。
# 注意在 DGL 中,点和边的特征可以是多维的。
g.ndata['y'] = torch.randn(6, 5, 4)
print(g.edata['a'])

下图中心形代表是边的特征。
在这里插入图片描述
请注意,这里我们为 ndata 赋予了 x 和 y 两种特征,这里的 x 和 y 就是节点的特征名称,应该是作为一个key去查询所有节点对应的 tensor 列表,然后返回相应的值。同理我们可以赋予更多的特征,然后给特征起名。
在这里插入图片描述
其他建议:

·对于分类属性(例如性别、职业),请考虑将它们转换为整数或 one-hot 编码。
·对于可变长度的字符串内容(例如新闻文章),请考虑应用语言模型。
·对于图像,请考虑应用 CNN 等 CV 模型。

图结构的查询

DGLGraph 对象提供了不同的方法,以方便我们查询图的结构。

查询节点数量

print(g.num_nodes())

查询边数量

print(g.num_edges())

中心节点 0 的出度

print(g.out_degrees(0))

中心节点 0 的入度

print(g.in_degrees(0))

代码整合

# 图结构的查询
"""DGLGraph 对象提供了不同的方法,以方便我们查询图的结构。"""
# 查询节点数量
print(g.num_nodes())
# 查询边数量
print(g.num_edges())
# 中心节点 0 的出度
print(g.out_degrees(0))
# 中心节点 0 的入度,这里是有向图所以入度应该为0
print(g.in_degrees(0))

图变换

图变换主要包含两种:子图和反向边。子图指的是从一张图中抽离相关的顶点或者相关的边组成新的图;反向边是指将图中每个边添加相反方向的边,一般用于将有向图转变成无向图。

子图

DGL 提供了许多API,让我们可以将图转换为其他结构,比如提取一个子图。这方便我们查询子图和原图的关系。子图的抽取可以分为两种方式:按照边和按照顶点。

# 从原图的节点0、节点1和节点3产生一个子图。
sg1 = g.subgraph([0, 1, 3])
# 从原图的边0、边1和边3产生一个子图。
sg2 = g.edge_subgraph([0, 1, 3])# 对应的节点为:0 1 2  4
"""通过 dgl.NID 或 dgl.EID 我们可以获得从子图到原图的节点/边映射,如下:"""
# The original IDs of each node in sg1
print(sg1.ndata[dgl.NID])
# The original IDs of each edge in sg1--->边的编号:(0,1):编号0    (0,3):编号2
print(sg1.edata[dgl.EID])
# The original IDs of each node in sg2
print(sg2.ndata[dgl.NID])
# The original IDs of each edge in sg2
print(sg2.edata[dgl.EID])

此外, subgraph 和 edge_subgraph 也复制了原图的点和边特征到子图:

# The original node feature of each node in sg1
print(sg1.ndata['x'])
# The original edge feature of each node in sg1
print(sg1.edata['a'])
# The original node feature of each node in sg2
print(sg2.ndata['x'])
# The original edge feature of each node in sg2
print(sg2.edata['a'])

增加反向边

还有一种常用的变换就是,使用 dgl.add_reverse_edges ,向原图的每一条边都增加一个反向边。比如你希望建立一个双向图的时候,这就很有用了。再强调一下,如果你想建立一个无向图,那最好当做双向图来建立

newg = dgl.add_reverse_edges(g)
newg.edges()

图的保存和读取

您可以通过dgl保存一个图形或一个图形列表。保存并使用dgl.load_graphs加载它们如下所示:(当然保存图可以保存一张或者多张,读取亦是如此)

# 保存图
dgl.save_graphs('graph.dgl', g)     # 保存一张图
dgl.save_graphs('graphs.dgl', [g, sg1, sg2]) # 保存多张图

# 读取图
(g,), _ = dgl.load_graphs('graph.dgl')
print(g)
(g, sg1, sg2), _ = dgl.load_graphs('graphs.dgl')
print(g)
print(sg1)
print(sg2)

当使用了 save_graphs 命令后,我们可以看到在当前目录下多了两个 .dgl 文件,这就是我们保存的两个图。其中 graphs.dgl 文件包含了之前创建的原图和两个子图。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1209567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03 # 类型基础:动态类型与静态类型

通俗定义 静态类型语言:在编译阶段确定所有变量的类型 编译阶段确定属性偏移量用偏移量访问代替属性名访问偏移量信息共享 动态类型语言:在执行阶段确定所有变量的类型 在程序运行时,动态计算属性偏移量需要额外的空间存储属性名所有对象的…

246:vue+openlayers 绘制多边形,drawend获取最大幅宽

第246个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中绘制多边形,drawend获取最大幅宽。这里利用turf的turf.distance和openlayers的getExtent获取坐标值。 距离赤道越近,幅宽会越大一些,这里面利用了Math.abs来做绝对值的判断处理。 直接复制下面的 vue+open…

HBase学习笔记(3)—— HBase整合Phoenix

目录 Phoenix Shell 操作 Phoenix JDBC 操作 Phoenix 二级索引 HBase整合Phoenix Phoenix 简介 Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表,插入数据和查询 HBase 数据 使用Phoenix的优点 在 Client 和 HBase …

docker-compose 部署 MySQL 8

前言 Windows 系统通过 docker-compose 部署 MySQL8.0。 MySQL 配置文件(my.cnf) # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时将使用的默认存储引擎 character-set-serverutf8mb4 # 设置mysql服…

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度:Strongly Disagree——非常不同意,用“0”表示;Disagree——不同意,用“1”表示;Agree--同意,用“2”表示;Strongly Agree--非常…

从0到0.01入门 Webpack| 002.精选 Webpack面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

基础课1——智能客服的定义

1.介绍 智能客服是一种采用人工智能技术的客户服务方式,它通过语音识别、自然语言处理、语义理解等技术,实现了与客户的自动交互。智能客服可以提供客户24小时不间断的服务,帮助客户快速解决问题,提高客户满意度。智能客服的应用…

oracle-buffer cache

段,区,块。 每当新建一个表,数据库会相应创建一个段。然后给这个段分配一个区。 一个区包含多个块。 区是oracle给段分配空间的最小单位。 块是oracle i\o的最小单位。 原则上,一个块包含多行数据。 dbf文件会被划分成一个一个…

学开发语言 求职互联网行业的未来发展

我喜欢回答各种各样的问题,自然也喜欢记录下自己的一些观点和看法。希望给朋友们多一点参考,也欢迎交流探讨。 提问: 自考本科,学的开发语言,问互联网行业求职和发展! 作为一个资深码农,对这样…

分库分表之后,主键ID如何处理?

前言 当关系型数据库数据量过大时,通常会采用分库分表降低数据库查表压力。分库分表有多种,有分一个库多张分表额,有分多个库多张表的。一般分库分表使用ShardingSphere分表,建分片键等。但是分库分表之后,主键ID如何处…

快速掌握华为VRP系统的CLI管理技巧,让你轻松玩转命令行!

华为VRP基础 基本概述 VRP(通用路由平台) 系统软件:.cc 配置文件:.cfg,.zip,.dat 补丁文件:.pat paf文件:.bin 设备初始化: 设备管理方式: WEB网管:配置与设备同网段IP地址,使用浏览…

OpenGL_Learn11(光照)

目录 1. 光照 2. 环境光照 3. 漫反射光照 4. 代码实战 1. 光照 在OpenGL中主要分以下几个光照类型 环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不…

高德地图系列(一):vue项目如何使用高德地图、入门以及基本控件使用

目录 第一章 前言 第二章 准备工作 2.1 账号注册 2.2 高德地图开发平台文档 2.3 创建应用 第三章 使用地图 3.1 地图使用步骤 3.2 理解几个地图基础控件 3.3 基础类理解 第一章 前言 小编都是在vue项目中使用高德地图的,每一个功能都会亲测可用之后才会…

【2014年数据结构真题】

41. (13分)二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。 给定一棵二叉树T,采用二叉链表存储,结点结构如下: 其中叶结点的weight域保存该结点的非负权值。 设root为指向T的根结点的指针, 请设计求T 的WPL…

linux下安装向日葵

https://sunlogin.oray.com/download/linux?typepersonal下载 在文件所在位置的空白处右键(在此处打开终端) 输入命令: sudo dpkg -i 文件名.deb (文件名为下载的deb文件名字)/usr/local/sunlogin/bin/sunlogincl…

JVM实战-JVM之类加载时机

目录 JVM实战-JVM之类加载时机1 主动引用2 被动引用 JVM实战-JVM之类加载时机 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机…

No208.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

arcgis--二维建筑面的三维显示设置

1、打开ArcScene软件,导入数据,如下: 2、 对建筑面进行拉伸。双击建筑物面图层,打开属性表,选择【拉伸】选项卡,参数设置如下: 显示结果如下:

第一篇 《随机点名答题系统》简介及设计流程图(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

专栏目录 第一篇 《随机点名答题系统》简介及设计流程图(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)-CSDN博客 第二篇 《随机点名答题系统》——题库管理详解(类抽奖系统、在线答题…

万宾科技内涝积水监测仪效果,预警城市积水

当城市之中出现强降雨或者大暴雨,可能会导致雨水不断堆积到城市排水管网之中,可能还会淹没城市的排水系统时,这种现象被称为城市之中的内涝,并且在许多城市之中内涝问题日益引起人们的关注。 内涝积水监测仪的出现成为了希望的灯塔…