DGL创建异构图

news2025/1/11 15:09:23

利用DGL创建具有3种节点类型和3种边类型的异构图

graph_data = {
   # (src_type, edge_type, dst_type)

   ('drug', 'interacts', 'drug'): (th.tensor([0, 1]), th.tensor([1, 2])),
   ('drug', 'interacts',, 'disease'): (th.tensor([1]), th.tensor([2]))
}

g = dgl.heterograph(graph_data)

上述代码相当于创建了一张异构图,其中:

0 号 drug interacts了 1号 drug
1 号 drug interacts了 2号 drug
0 号 drug interacts了 1号 gene
2 号 drug interacts了 3号 gene
1 号 drug treats 了 2号disease

在这里插入图片描述
对于上图,我们可以通过g.ntypesg.etypes查看节点和边的类型,同时可以查看规范边的类型,即g.canonical_etypes

(规范边:在DGL中,一个异构图由一系列子图构成,一个子图对应一种关系。每个关系由一个字符串三元组 定义 (源节点类型, 边类型, 目标节点类型) 。由于这里的关系定义消除了边类型的歧义,DGL称它们为规范边类型。)

同构图和二分图只是一种特殊的异构图,它们只包括一种关系。
一个同构图的伪代码:

dgl.heterograph({('node_type', 'edge_type', 'node_type'): (u, v)})

一个二分图的伪代码:

dgl.heterograph({('source_type', 'edge_type', 'destination_type'): (u, v)})

同时异构图使用metagraph呈现点与点之间的关系的,下面是一个例子:

print('g:',g)

out: g: Graph(
num_nodes={‘disease’: 3, ‘drug’: 3, ‘gene’: 4},
num_edges={(‘drug’, ‘interacts’, ‘drug’): 2, (‘drug’, ‘interacts’, ‘gene’): 2, (‘drug’, ‘treats’, ‘disease’): 1},
metagraph=[(‘drug’, ‘drug’, ‘interacts’), (‘drug’, ‘gene’, ‘interacts’), (‘drug’, ‘disease’, ‘treats’)])

使用多种类型节点和边的异构图

当引入多种节点和边类型后,用户在调用DGLGraph API以获取特定类型的信息时,需要指定具体的节点和边类型。此外,不同类型的节点和边具有单独的ID。

# 获取图中所有节点的数量
g.num_nodes()
# 获取drug节点的数量
g.num_nodes('drug')
# 不同类型的节点有单独的ID。因此,没有指定节点类型就没有明确的返回值。
# g.nodes()---》会报错
# DGLError: Node type name must be specified if there are more than one node types.
g.nodes('drug')

为了设置/获取特定节点和边类型的特征,DGL提供了两种新类型的语法: (伪代码)

g.nodes[‘node_type’].data[‘feat_name’] 
和 
g.edges[‘edge_type’].data[‘feat_name’]

以下是该代码的应用:

# 设置/获取"drug"类型的节点的"hv"特征
g.nodes['drug'].data['hv'] = th.ones(3, 1)
print('获取已经设置的drug类型的节点的hv属性:',g.nodes['drug'].data['hv'])

# 设置/获取"treats"类型的边的"he"特征
g.edges['treats'].data['he'] = th.zeros(1, 1)
print('获取已经设置的treats类型的节点的he属性:',g.edges['treats'].data['he'])

但是当图中仅有一种节点或者边的类型时,则不需要指定节点或者边的类型:

g = dgl.heterograph({
   ('drug', 'interacts', 'drug'): (th.tensor([0, 1]), th.tensor([1, 2])),
   ('drug', 'is similar', 'drug'): (th.tensor([0, 1]), th.tensor([2, 3]))
})
g.nodes()
# 设置/获取单一类型的节点或边特征,不必使用新的语法
g.ndata['hv'] = th.ones(4, 1)

边类型子图

用户可以通过指定要保留的关系来创建异构图的子图,相关的特征也会被拷贝。

g = dgl.heterograph({
   ('drug', 'interacts', 'drug'): (th.tensor([0, 1]), th.tensor([1, 2])),
   ('drug', 'interacts', 'gene'): (th.tensor([0, 1]), th.tensor([2, 3])),
   ('drug', 'treats', 'disease'): (th.tensor([1]), th.tensor([2]))
})
g.nodes['drug'].data['hv'] = th.ones(3, 1)
# 保留关系 ('drug', 'interacts', 'drug') 和 ('drug', 'treats', 'disease') 。
# 'drug' 和 'disease' 类型的节点也会被保留
eg = dgl.edge_type_subgraph(g, [('drug', 'interacts', 'drug'),
                                ('drug', 'treats', 'disease')])
print('形成的子图:',eg)

同时相关的特征也会被保存:

# 相关的特征也会被拷贝
print(eg.nodes['drug'].data['hv'])

DGL提供了 dgl.save_graphs() 和 dgl.load_graphs() 函数,分别用于以二进制格式保存异构图和加载它们。

DGL提供了 dgl.save_graphs() 和 dgl.load_graphs() 函数,分别用于以二进制格式保存异构图和加载它们。

将异构图转成同构图

异构图有如下的优点:

  1. 不同类型的节点和边的特征具有不同的数据类型或大小
  2. 用户希望对不同类型的节点和边应用不同的操作

但是如果不希望区分节点和边的类型可以使用dgl.DGLGraph.to_homogeneous() 将异构图转成同构图,具体包括以下步骤:

  1. 用从0开始的连续整数重新标记所有类型的节点和边。
  2. 对所有的节点和边合并用户指定的特征
g = dgl.heterograph({
   ('drug', 'interacts', 'drug'): (th.tensor([0, 1]), th.tensor([1, 2])),
   ('drug', 'treats', 'disease'): (th.tensor([1]), th.tensor([2]))})
g.nodes['drug'].data['hv'] = th.zeros(3, 1)
g.nodes['disease'].data['hv'] = th.ones(3, 1)
g.edges['interacts'].data['he'] = th.zeros(2, 1)
g.edges['treats'].data['he'] = th.zeros(1, 2)
# 默认情况下不进行特征合并
hg = dgl.to_homogeneous(g)
# 查看原始的节点特征是否在创建的同构图中:
print('hv' in hg.ndata)
# out: False

拷贝边的特征:对于要拷贝的特征,DGL假定不同类型的节点或边的需要合并的特征具有相同的大小和数据类型。执行hg = dgl.to_homogeneous(g, edata=['he'])会报错:
因为

 g.edges['interacts'].data['he'] = th.zeros(2, 1)

  g.edges['treats'].data['he'] = th.zeros(1, 2) 

具有不同的shape因此会报错(DGLError: Cannot concatenate column ‘he’ with shape Scheme(shape=(2,), dtype=torch.float32) and shape Scheme(shape=(1,), dtype=torch.float32)

而节点的特征是有一致的shape所以可以进行拷贝,例如这里的节点的特征的shape是一致的,所以可以进行拷贝。

# 拷贝节点特征
hg = dgl.to_homogeneous(g, ndata=['hv'])
print('拷贝后节点的特征:',hg.ndata['hv'])

原始的节点和边的类型以及对应的ID被保存在ndata和edata中。

节点特征:

# 异构图中节点类型的顺序
print('原始异构图中节点类型的顺序:',g.ntypes)
# 原始节点类型
print('原始异构图中节点类型:',hg.ndata[dgl.NTYPE])
# 原始的特定类型节点ID
print('原始的特定类型节点ID:',hg.ndata[dgl.NID])

边特征:

# 异构图中边类型的顺序
print('异构图中边类型的顺序:',g.etypes)
# 原始边类型
print('原始边类型:',hg.edata[dgl.ETYPE])
# 原始的特定类型边ID
print('原始的特定类型边ID:',hg.edata[dgl.EID])

子图合并

出于建模的目的,用户也可以只对其中的子图进行关系的合并:

g = dgl.heterograph({
   ('drug', 'interacts', 'drug'): (th.tensor([0, 1]), th.tensor([1, 2])),
   ('drug', 'interacts', 'gene'): (th.tensor([0, 1]), th.tensor([2, 3])),
   ('drug', 'treats', 'disease'): (th.tensor([1]), th.tensor([2]))
})
sub_g = dgl.edge_type_subgraph(g, [('drug', 'interacts', 'drug'),
                                   ('drug', 'interacts', 'gene')])
h_sub_g = dgl.to_homogeneous(sub_g)
print(h_sub_g)

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

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

相关文章

C编译环境和预处理(非常详细,建议收藏)

C编译环境和预处理(非常详细,建议收藏) 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么? 2.2 运行环境 三、预处理详解3.1 预定义…

C语言--每日五道选择题--Day19

第一题 1. 为了避免在嵌套的条件语句if-else中产生二义性,C语言规定else子句总是与( )配对。 A:缩排位置相同的if B:之前最近的未匹配的if配对 C:其之后最近的if D:同一行上的if 答案及解析 B e…

一图多码如何分解?快速做二维码解码的方法

当遇到一张图片里面有多个二维码时,想要将图片中的二维码分解成链接或者文本,该如何来操作呢?一般解决这个问题的方法多会通过使用二维码解码器来完成操作,那么对于还不知道的怎么操作的小伙伴,下面的方法可以来学习一…

Linux:安装IDEA开发工具

1、下载 下载地址:https://www.jetbrains.com/idea/download/?sectionlinux 2、上传及解压 将安装包上传到虚拟机,我建的目录是/opt/idea 解压:tar -zxvf ideaIU-2023.2.5.tar.gz 3、启动 启动IDEA需要登陆桌面系统,不能在…

剪辑视频怎么把说话声音转成文字?

短视频已然成为了一种生活潮流,我们每天都在浏览各种短视频,或者用视频的形式记录生活,在制作视频的时候,字幕是一个很大的问题,给视频添加字幕可以更直观、更方便浏览。手动添加太费时间,下面就给大家分享…

bitmap实践-留存计算

目录 1. 介绍2. 留存问题3. 思路解析4. 逻辑4.1 b表建设4.2 留存计算4.3 近X天的访问天数 5.分析 1. 介绍 bitmap方法是数据压缩使用的常用算法,当字段有明确上下界的时候,使用位图模式来减少存储。在业务指标体系中特别适合通用型留存指标的计算。 2.…

数智赋能,众创众治|易知微为“浙江省数字监管应用建模技能竞赛”提供技术支撑!

11月6日至8日,2023年浙江省数字监管应用建模技能竞赛在省金华监狱举行。浙江省监狱管理局党委书记、局长王争,司法部监狱管理局规划科技处处长常家瑛,浙江省监狱管理局党委委员、副局长朱永忠出席本次活动。 本次建模大赛共有来自全省监狱系…

MODBUS转PROFINET网关TS-180连接西门子PLC和工业称重仪表

项目 随着科技的高速发展,工业自动化行业对日益多样的称重需求越来越高,上海某公司在国内的一个 工业自动化项目中,监控中心系统需要远程实时采集工业称重仪表测量的各种称重参数。该系统使用的是 西门子 S7-300 PLC,支持 PROFINE…

邮箱设置第三方登录授权码获取

以QQ邮箱为例 QQ邮箱设置——账户 开启POP3/SMTP服务——完成验证后获得授权码,保存授权码

微信、支付宝、携程等多款app任意文件读取漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、漏洞描述 微信、支付宝、小米浏览器、携程应用等国内主流软件均存…

gin相关操作--一起学习921190764

gin官方文档 https://gin-gonic.com/docs/quickstart/1. 安装 go get -u github.com/gin-gonic/ginhttps://github.com/gin-gonic/gin简单入门 package mainimport ("github.com/gin-gonic/gin""net/http" )func pong(c *gin.Context) {//c.JSON(http.S…

“Python+”集成技术高光谱遥感数据处理

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论,旨在帮助学员深入理解科学原理。结合Python编程工具,专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题,…

PPT基础:编辑顶点

目录 编辑顶点对顶点的编辑对线段的编辑编辑顶点用法 编辑顶点 所在位置: 实质:是一种改变图像性质的操作 如何把一个圆形变成三角形:选中其中一个顶点,右键删除一个顶点;靠近某一条边,右键“拉伸弓形”即…

壹基金为爱同行到余村,以一步步健行换一滴滴净水

为帮助乡村儿童喝上干净的、足量的饮用水,壹基金联合可口可乐中国发起为爱同行2023安吉余村公益健行活动。本次活动得到了湖州市安吉县天荒坪镇人民政府、湖州市安吉县天荒坪镇余村村村民委员会的大力支持,由深圳市登山户外运动协会、文益社、悦跑圈联合主办。参与健行不仅能感…

「Python编程基础」第3章:控制流

文章目录 一、用“炒菜”简单介绍下“控制流”二、布尔值三、比较运算符四、 和 操作符的区别五、布尔操作符六、混合布尔和比较操作符七、代码块是什么?八、控制流语句1. if 语句2. else语句3. elif语句4. 总结 九、while循环语句十、break语句十一、continue语句…

竞赛选题 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…

Windows通过ssh连接远程服务器并进入docker容器

Windows操作系统可以使用vscode通过ssh远程连接ubuntu服务器: 首先下载安装vscode,然后安装插件Remote-SSH: 通过ctlshiftP可以打开Remote-SSH:connect to host; 输入ssh Userhostname -p port host和hostname对应的是…

力扣 2. 两数相加

Problem: 2. 两数相加 思路与算法 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this…

numpy报错:AttributeError: module ‘numpy‘ has no attribute ‘float‘

报错:AttributeError: module numpy has no attribute float numpy官网:NumPy 报错原因:从numpy1.24起删除了numpy.bool、numpy.int、numpy.float、numpy.complex、numpy.object、numpy.str、numpy.long、numpy.unicode类型的支持。 解决办法…

HarmonyOS开发:ArkTs常见数据类型(一)

前言 无论是Android还是iOS开发,都提供了多种数据类型用于常见的业务开发,但在ArkTs中,数据类型就大有不同,比如int,float,double,long统一就是number类型,当然了也不存在char类型&a…