DGL创建异构图

利用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.rhkb.cn/news/198820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmake+OpenCV4.8.0+contrib4.8.0+cuda 12.2编译踩坑

cmakeOpenCV4.8.0contrib4.8.0cuda 12.2编译踩坑 准备工具 cmake (去官网下载)OpenCV 我下载的是官网发布最新的稳定版本对应的源码,官网目前是4.8.0,github下一个(连不上的可以网上找找资源或者科学上网&#xff09…

wpf devexpress Property Grid创建属性定义

WPF Property Grid控件使用属性定义定义如何做和显示 本教程示范如何绑定WP Property Grid控件到数据和创建属性定义。 执行如下步骤 第一步-创建属性定义 添加PropertyGridControl组件到项目。 打开工具箱在vs,定位到DX.23.1: Data 面板,选择Prope…

亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight

目录 Amazon QuickSight简介 Amazon QuickSight的独特之处 Amazon QuickSight注册 Amazon QuickSight使用 Redshift和Amazon QuickSightt平台构建数据可视化应用程序 构建数据仓库 数据可视化 Amazon QuickSight简介 亚马逊QuickSight是一项可用于交付的云级商业智能 (BI…

Docker在Centos7下的安装

1、卸载旧版本 执行如下指令对旧版本进行卸载: sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 执行完毕后,如果输入docker version发现do…

js计算某个时间距离现在有几年几月几日几分几秒之前的方法

数据类型 使用js时间戳 console.log(Date.now()) //1642471441587 或者转化为时间戳才能使用 Date.parse(“2022/1/18 10:05”) //1642471500000 将时间戳转化成时间格式的方法如下–链接查看 https://mp.weixin.qq.com/s?__bizMjM5MDA2MTI1MA&mid2649121025&idx2&am…

android studio导入eclipse项目

网上下载一个老工程,.project文件里有eclipse。 android studio导入eclipse项目 eclipse项目结构 Android studio文件结构 下面是导入步骤: 第一步,打开一个项目。 选择File->New->Import Project 第二步,选择Eclipse项目根…

NX二次开发UF_CAM_ask_doc_template_name 函数介绍

文章作者:里海 来源网站:里海NX二次开发3000例专栏 UF_CAM_ask_doc_template_name Defined in: uf_cam.h int UF_CAM_ask_doc_template_name(const char * * doc_template_filename ) overview 概述 This function provides the name of the file th…

Linux mmap 的作用是什么?

文章目录 1.简介2.相关函数3.mmap和常规文件操作的区别4.作用参考文献 1.简介 mmap&#xff08;memory map&#xff09;即内存映射&#xff0c;用于将一个文件或其它对象映射到进程的地址空间。 2.相关函数 创建映射函数&#xff1a; #include <sys/mman.h>void *mm…

浅谈 JVM GC 收集器--系列(一)

又到一年大促时刻&#xff0c;今天我们一起探讨下JVM垃圾回收的问题&#xff0c;写代码的时候想一想如何减少FullGC问题的出现&#xff0c;因为一旦出现频繁FullGC&#xff0c;短时间内没有太好的解决办法&#xff0c;很有可能重启后服务接着FullGC&#xff0c;导致服务可用率降…

【运维篇】Redis常见运维命令详解

文章目录 1. 前言2. 连接管理命令详解2.1 AUTH命令2.2 PING命令2.3 SELECT命令2.4 QUIT命令 3. 服务器管理命令详解3.1 FLUSHALL命令3.2 SAVE/BGSAVE命令3.3 SHUTDOWN命令 4. 安全管理命令详解4.1 CONFIG命令4.1.1 CONFIG SET命令用法4.1.2 CONFIG GET命令用法 4.2 AUTH命令 5.…

海外代理IP如何找到靠谱的?

现在市面上有很多代理服务商&#xff0c;大家可以根据自己的需求选择一个适合自己业务的的IP代理服务商&#xff0c;现在也有一些免费的&#xff0c;但如果力求稳定安全&#xff0c;还是选择付费的。 这里提醒一句&#xff0c;在买代理IP时最好找这种可以免费试用的&#xff0…

kernel32.dll丢失都有什么解决办法,帮助大家解决kernel32.dll丢失的问题

kernel32.dll丢失是电脑中常出现的情况&#xff0c;今天就想和大脚聊聊这个kernel32.dll 文件&#xff0c;这个文件它的功能是干什么的&#xff0c;如果电脑中kernel32.dll 丢失都有什么解决办法&#xff0c;帮助大家解决kernel32.dll丢失的问题&#xff0c;本篇文章给大家提供…

鸿蒙:Harmony开发基础知识详解

一.概述 工欲善其事&#xff0c;必先利其器。 上一篇博文实现了一个"Hello Harmony"的Demo&#xff0c;今天这篇博文就以"Hello Harmony" 为例&#xff0c;以官网开发文档为依据&#xff0c;从鸿蒙开发主要的几个方面入手&#xff0c;详细了解一下鸿蒙开…

MIUI查看当前手机电池容量

MIUI查看当前手机电池容量 1. 按如下步骤操作生成bug报告 2. 按如下操作解压bug报告 Last learned battery capacity

分布式服务与分布式框架

分布式副武其实就是根据某个粒度&#xff0c;将服务拆分&#xff0c;而分布式框架就是将这些服务协调&#xff0c;管理起来。分布式框架&#xff0c;我认为服务调用是他的基础能力&#xff0c;该能力是所有分布式框架的基础能力&#xff0c;其次是服务注册与发现。 在这个维度…

TCP与UDP协议

TCP与UDP协议 1、TCP协议&#xff1a; 1、TCP特性&#xff1a; TCP 提供一种面向连接的、可靠的字节流服务。在一个 TCP 连接中&#xff0c;仅有两方进行彼此通信。广播和多播不能用于 TCP。TCP 使用校验和&#xff0c;确认和重传机制来保证可靠传输。TCP 给数据分节进行排序…

[C++]:8.C++ STL引入+string(介绍)

C STL引入string(介绍&#xff09; 一.STL引入&#xff1a;1.什么是STL2.什么是STL的版本&#xff1a;2-1&#xff1a;原始版本&#xff1a;2-2&#xff1a;P. J 版本&#xff1a;2-3&#xff1a;RW 版本&#xff1a;2-4&#xff1a;SGL版本&#xff1a; 3.STL 的六大组件&…

WhatsApp新营销全解:如何才能真正留住你的客户

WhatsApp营销这件事上&#xff0c;从获取线索、留存客户、成交转化到复购推荐的整个流程中&#xff0c;方方面面的因素影响着最终的转化效果。今天开始&#xff0c;我们会在公众号内新增WhatsApp新营销全解系列&#xff0c;结合前人踩过的坑和成功经验&#xff0c;来为大家说说…

读《Segment Anything in Defect Detection》

摘要 (好像只是说把SAM应用到了红外缺陷分割领域) 引言 无损检测得到红外图像&#xff0c;根据热能观察异常 贡献&#xff1a; •从两个光学脉冲热成像系统构建广泛的缺陷热数据库&#xff0c;包括各种材料并释放它们。 • 开发DefectSAM&#xff0c;这是第一个用于缺陷检测…

Android 解决CameraView叠加2个以上滤镜拍照黑屏的BUG (二)

1. 前言 这段时间&#xff0c;在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位&#xff0c;在项目前期&#xff0c;的确为我们节省了不少时间。 但随着项目持续深入&#xff0c;对于CameraView的使用进入深水区&#xff0c;逐…