DGL图概念(一)_陨星落云的博客-程序员秘密_dgl 无向图

技术标签: DGL  

1.1 关于图的一些基本定义

图 G=(V,E)是用于表示实体及其关系的结构。它由两部分组成-节点集合VV(也称为顶点)和一组边 E(也称为弧)。(u,v)∈E 连接一对节点 u 和 v表示它们之间存在关系。该关系可以是无向的,例如捕获节点之间的对称关系,也可以是有向的,捕获非对称关系。例如,如果使用图形对社交网络中人们的友谊关系进行建模,则由于友谊是相互的,因此边缘将是无方向的。但是,如果使用该图来模拟人们在Twitter上的彼此跟随的方式,那么将引导边缘。根据边缘的方向性,图可以是有向的或无向的。

图可以加权或不加权。在加权图中,每个边都与标量权重相关联。例如,这种权重可能代表长度或连接强度。

图也可以是同质或异质的。在同质图中,所有节点表示相同类型的实例,所有边均表示相同类型的关系。例如,社交网络是由人及其联系组成的图,代表相同的实体类型。

相反,在异构图中,节点和边可以具有不同的类型。例如,编码市场的图形将具有通过要购,已购买,是客户和销售边缘相连的买方,卖方和产品节点。二部图是一种特殊的常用类型的异构图,其中边存在于两种不同类型的节点之间。例如,在推荐系统中,可以使用二部图来表示用户和项目之间的交互。有关在DGL中使用异构图的信息,请参见1.5异构图

多图是在同一对节点(包括自环)之间可以具有多个(有向)边的图。例如,两位作者可以在不同的年份共同撰写论文,从而导致边缘具有不同的特征。

1.2 图、节点和边

DGL用称为其节点ID的唯一整数表示每个节点,并用对应于其端节点ID的一对整数表示每个边。DGL根据将其添加到图形的顺序,为每个边缘分配一个唯一的整数,称为其边缘ID。节点和边缘ID的编号从0开始。在DGL中,所有边缘都有方向,而边(u,v)指示方向从节点 u 到节点 v。

为了指定多个节点,DGL使用节点ID的一维整数张量(即PyTorch的张量,TensorFlow的Tensor或MXNet的ndarray)。DGL将此格式称为“节点张量”。要指定多个边,它使用节点张量的元组(U,V)。 (U[i],V[i]) 决定从 U[i]] 至 V[i]。

创建方法的一种方法DGLGraph是使用dgl.graph()方法,该方法将一组边作为输入。DGL还支持从其他数据源创建图形,请参见1.4从外部源创建图形

以下代码段使用该dgl.graph()方法来创建DGLGraph 与以下所示的四节点图相对应的图,并说明了用于查询图结构的一些API。

在这里插入图片描述

import dgl 
import torch as th

# edges 0->1,0->2,0->3,1->3
u,v = th.tensor([0,0,0,1]),th.tensor([1,2,3,3])
g = dgl.graph((u,v))

print('图:\n',g)
print('节点:\n',g.nodes())
print('边:\n',g.edges())
print('边与节点:\n',g.edges(form='all'))

g = dgl.graph((u,v), num_nodes=8)
# print(g.edges(form='all'))

结果:

图:
 Graph(num_nodes=4, num_edges=4,
      ndata_schemes={}
      edata_schemes={})
节点:
 tensor([0, 1, 2, 3])
边:
 (tensor([0, 0, 0, 1]), tensor([1, 2, 3, 3]))
边与节点:
 (tensor([0, 0, 0, 1]), tensor([1, 2, 3, 3]), tensor([0, 1, 2, 3]))

对于无向图,需要为两个方向都创建边。dgl.to_bidirected() 在这种情况下会很有用,它将图形转换为一个新的带有两个方向的边的图形。

# 双边图
bg = dgl.to_bidirected(g)
print('无向图:\n',bg.edges())

结果:

无向图:
 (tensor([0, 0, 0, 1, 1, 2, 3, 3]), tensor([1, 2, 3, 0, 3, 0, 0, 1]))

注意:在DGL API中,通常优选使用Tensor类型,因为它们在C中的有效内部存储以及显式数据类型和设备上下文信息。但是,大多数DGL API确实支持将python可迭代(例如list)或numpy.ndarray作为快速原型的参数。

DGL可以使用 32- 要么 64位整数,用于存储节点和边缘ID。节点和边缘ID的数据类型应该相同。通过使用646位,DGL最多可以处理图 2 63 − 1 2^{63}−1 2631节点或边。但是,如果图形包含少于 2 31 − 1 2^{31}−1 2311节点或边,应使用 32位整数,因为它可以提高速度,并需要较少的内存。DGL提供了进行此类转换的方法。请参阅下面的示例。

u,v = th.tensor([2,5,3]),th.tensor([3,5,0])
edges = (u,v)
# 默认int64
g64 = dgl.graph(edges)
print(g64.idtype)
# 创建int32
g32 = dgl.graph(edges,idtype=th.int32)
print(g32.idtype)
# int32转64
g64_2 = g32.long()
print(g64_2.idtype)
# int64转32
g32_2 = g64.int()
print(g32_2.idtype)

结果:

torch.int64
torch.int32
torch.int64
torch.int32

见的API: ,dgl.graph()dgl.DGLGraph.nodes()dgl.DGLGraph.edges()dgl.to_bidirected()dgl.DGLGraph.int()dgl.DGLGraph.long()dgl.DGLGraph.idtype

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28368377/article/details/108537523

智能推荐

云星数据---Scala实战系列(精品版)】:Scala入门教程017-Scala实战源码-Scala 创建对象 以及类的介绍_李国华技术博客的博客-程序员秘密

Scala 创建对象 以及类的介绍package scala_learn.demo02_oop/** * Created by liguohua on 2017/2/28. */class O1_ObjectDemo {}object O1_ObjectDemo { def main(args: Array[String]) { //创建一个Person对象,使用Person类的无

Docker安装初试&&制作centos6.5基础镜像_Celeste7777的博客-程序员秘密

https://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html https://yeasy.gitbooks.io/docker_practice/content/basic_concept/container.html centos7.x系列的yum源中自带了docker的rpm包,安装比较简单# yum install do

react-native Text 多余的字数隐藏,并用省略号显示_reactnative。一行文字怎么溢出隐藏_像树_的博客-程序员秘密

参考 https://reactnative.cn/docs/text#numberoflinesnumberOfLines用来当文本过长的时候裁剪文本。包括折叠产生的换行在内,总的行数不会超过这个属性的限制。此属性一般和ellipsizeMode搭配使用。ellipsizeMode这个属性通常和下面的 numberOfLines 属性配合使用,表示当 Text 组件无法全部显示需要...

第57部分- Linux x86 64位汇编改动寄存器列表_x86 64位寄存器列表_badman250的博客-程序员秘密

第57部分- Linux x86 64位汇编改动寄存器列表编译器假设输入值和输出值使用的寄存器会被改动,并相应的做出处理。程序员不需要在改动的寄存器列表中包含这些值。示例#include <stdio.h>int main(){ int data1 = 10; int result = 20; asm ("movl %1, %%eax\n\t" "addl %%eax, %0" : "=r"(result)

SQL FIRST() 函数_sql里面的first vlua_一杯苦茶的博客-程序员秘密

SQL FIRST() 函数FIRST() 函数FIRST() 函数返回指定的字段中第一个记录的值。提示:可使用 ORDER BY 语句对记录进行排序。SQL FIRST() 语法SELECT FIRST(column_name) FROM table_name不能执行:SELECT FIRST(column_name1),colum

随便推点

AssetBundle加载、卸载AB 资源文件(三)_ab包资源重复_true...的博客-程序员秘密

前面两个篇章已经介绍了如何生成AB 资源文件。这里主要是使用一个简单的工具类来加载 AB 资源文件。首先就是任意打一个 AB 包。创建一个 Test 脚本出来。将已经打包好的 AB 文件记录下路径。然后写代码:1、同步加载 AB 包完美运行:注意: AB 包是不能够重复进行加载的,同名的AB包是无法加载两次的。否则会报错。这里可以拿出一个案例。2、异步加载AB包想到异步的第一件事情就是使用协程进行加载了。3、卸载AB 包一般来说这个参数都会填 false如果为 true

umi 定制覆盖原有主题_umi 设置主题_tankpanv的博客-程序员秘密

在 Umi 里配置主题#如果你在使用Umi,那么可以很方便地在项目根目录的.umirc.ts或config/config.ts文件中theme字段进行主题配置。theme可以配置为一个对象或文件路径。定制主题 - Ant Designhttps://ant.design/docs/react/customize-theme-cn"theme": { "primary-color": "#1DA57A",},...

解析本地csv文件,并且存到数据库_疏疏残雪的博客-程序员秘密

引入依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.7</version> </dependency>编写工具类@Componentpublic class ReadCvsUtils {

Hadoop作业性能指标及参数调优实例 (二)Hadoop作业性能调优7个建议_hadoop性能指标_ebay的博客-程序员秘密

eBay拥有8个Hadoop集群,7000+节点,使用eBay Eagle进行集群管理,eBay平台支持团队提供技术咨询,帮助用户有效利用大数据。基于用户咨询,我们以Hadoop作业性能为研究范畴,阐述作业性能指标,给出参数调优建议。

python基础学习笔记<面向对象编程>_new_abc的博客-程序员秘密

来自:http://www.liaoxuefeng.com/类和实例面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。仍以Student类为例,在Python中,定义类是通过class关键字:class

Vue简单练习封装button按钮 直接上代码和效果图_el-button中有is-active_JQ...的博客-程序员秘密

&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8" /&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt; &lt;title&gt;Docum...

推荐文章

热门文章

相关标签