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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

110.firefly-overlayroot

折腾rk3399的开发板的时候,突然发现overlayroot这个词汇。 我移植一下linux5.10的内核到firefly3399开发板,结果启动之后文件系统提示只读!!! 这就让我很莫名。后来看到mount文件系统的情况,感觉也是不可…

集成多元算法,打造高效字面文本相似度计算与匹配搜索解决方案,助力文本匹配冷启动[BM25、词向量、SimHash、Tfidf、SequenceMatcher]

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

图解算法数据结构-LeetBook-栈和队列03_验证栈的取出顺序

现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照 一定 的顺序 放入 和 拿取 书籍。 给定一个表示图书放入顺序的整数序列 putIn,请判断序列 takeOut 是否为按照正确的顺序拿取书籍的操作序列。你可以假设放…

万宾科技智能井盖传感器,预防城市道路安全

随着城市交通的不断发展和城市化进程的加速推进,城市道路安全问题日益凸显。市政井盖作为城市道路的一部分,承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施,补足传统管理方式的…

bitmap实践-留存计算

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

RAID技术复习笔记

Raid(Redundant Array of independent Disks)独立磁盘冗余阵列:磁盘阵列 Raid 分为:软raid、硬raid、软硬混合三种。 软Raid:所有的功能均有操作系统和CPU来完成,没有独立的raid控制、处理芯片和IO处理处理芯片。 硬R…

如何从零开始制作一本企业宣传画册?

最近公司领导要求为公司制作一本企业宣传画册,用来展示我们的产品和服务,增加品牌影响力。可是,像我这种零基础的小白,完全不知道如何制作啊?对此我感到很焦虑,怕做不好影响公司形象,也怕耽误时…

LR学习笔记——初识lightroom

文章目录 介绍图库界面修改照片界面 介绍 Lightroom是Adobe公司开发的一款用于图片后期处理制作的软件,被称为Adobe Photoshop Lightroom。其增强的校正工具、强大的组织功能以及灵活的打印选项可以帮助加快图片后期处理速度,将更多的时间投入拍摄。 相…

Navicat DML 操作

在表格种插入 列信息 -- 修改数据 update 表名 set 列名 值1, 列名值2,[where 条件]; -- 注意:如果update语句没有加where 表里对应行的全部信息都会被改; -- 删除数据 delecte from 表名 [where 条件]; 未删除前: 执行删除后为: DQL - 条…

打印工具HandyPrint Pro Mac中文版软件特点

HandyPrint Pro Mac是一款打印工具,它支持AIrPrint协议,可以让用户在iPhone、iPad、iPod等设备上进行打印操作,只需要将这些设备连接到Mac电脑的WiFi网络中即可实现打印功能。 ​ HandyPrint Pro Mac软件特点 简单易用:用户只需…

不标年份的葡萄酒质量好吗?

我们在葡萄酒标上经常看到生产年份,也就是指全部葡萄采摘的年份。旧世界葡萄酒产国认为葡萄酒年份对他们的影响较大,而新世界葡萄酒,年份的意义就稍微小些。甚至有一部分葡萄酒酒标上没有年份。在酒标上没有标注年份的葡萄酒,被称…

Java(三)(static,代码块,单例设计模式,继承)

目录 static 有无static修饰的成员变量 有无static修饰的成员方法 static的注意事项 代码块 静态代码块 实例代码块 单例设计模式 饿汉式单例写法 懒汉式单例写法 继承 基本概念 注意事项 权限修饰符 单继承 object 方法重写 子类方法中访问其他成员(成员变量…

Druid介绍

Druid介绍 Druid首先是一个数据库连接池,并且是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。但它不仅仅是一个数据库连接池,它还包…

使用frp搭建内网穿透服务

使用frp搭建内网穿透服务 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 1.下载frp 下载地址 2.服务端安装 …

工作电压范围,转换速率高,相位补偿等特性的双运算放大器芯片D4510的描述

D4510是一块双运算放大器,具有较宽的工作电压范围,转换速率高,相位补偿等特性。电路能在低电源电压下:工作,电源电压范围:双电源为1V-3.5V和单电源电压为2V~7V。 主要特点: ● 低电压工作 ● 转换速率高 ● 动态输…

深度学习领域中的耦合与解耦

在阅读论文的时候应该会看到两个操作,一个是耦合,一个是解耦,经常搭配着出现的就是两个词语,耦合头(Coupled head)以及Decoupled head(解耦合头),那为什么要耦合&#xf…

冬天起不来床怎么办?羊大师给你好建议

冬天起不来床怎么办?羊大师给你好建议 冬季是让人感到懒散的季节,尤其是早上起床。寒冷的天气和温暖的被窝让人们很难离开床铺。如果你也常常遇到这个问题,不要担心,本文小编羊大师将为你分析起床困难的原因,并提供一…

“我“摸爬滚打5年,干了测试工程师,现在测试怎么样了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 小刘:…

nginx 代理接口报404 问题排查

今天遇到一个nginx代理后端接口请求报404的问题,问题是这样的,后端由于服务器没有环境,但是需要和前端联调,于是采用cpolar内网穿透的方式,穿出来了。但是前端请求跨域,于是前端用nginx代理了一下后端接口&…

网络工程师网络配置经典例题(五)

1、配置SwitchA的单臂静态BFD特性 [SwitchA] bfd [SwitchA-bfd] quit [SwitchA] bfd 1 bind peer-ip 10.2.2.2 interface vlanif 10 source-ip 10.1.1.1 one-arm-echo [SwitchA-bfd-session-1] discriminator local 1 [SwitchA-bfd-session-1] min-echo-rx-interval 200 …