当前位置: 首页 > news >正文

DGL教程

构建图graph

/data文件夹下

方法1:dgl.graph图构造器

pandas读取原始数据

import pandas as pd #用于读取raw data
df = pd.read_csv("/data/onlyknowndiseasemirnainteraction.txt",header=None, sep='\t') 
#逐行读取,‘\t‘ tab键切分

利用dgl.graph图构造器构造无特征的图像数据

dgl图构造器来构造图,需要知道

  1. 节点的个数:本例中(383+495=878)
  2. 边列表;dgl中的节点序号是从0开始,要用panda处理数据为0开头
  3. 依次添加节点特征和边特征
import dgl
import numpy as np
import torch

df = df-1 # 原始数据中节点的下表是从1开始,因此全部-1
g = dgl.graph((df[0].tolist(),df[1].tolist()),num_nodes = 878)
# df[0].tolist()是将第0列转变成一组List列表
print(g) #打印图,查看基本信息
print(g.edges()) #打印图中的边列表

Graph(num_nodes=878, num_edges=5430,
ndata_schemes={}
edata_schemes={})
此时图中没有节点和边的特征

(tensor([ 0, 1, 2, …, 13, 115, 147]),
tensor([495, 495, 495, …, 877, 877, 877]))

为dgl.graph图添加特征

注意:往图中添加的特征必须都是tensor格式

# 用相似度做特征
import torch
import numpy as np
# 这里我们先考虑同质图,因此需要做特征匹配
# 把495和383个特征,统一变成495,因此
# 要对383之外的特征赋值为0
features = np.zeros((878,495),dtype=float)

# 1读取miRNA的特征495*495
df_m = pd.read_csv("~/data/hmddv20/4.miNA functional simialrity/functional similarity matrix.txt",sep='\t',header=None)
# 用二维numpy存储前495个节点的特征
features[0:495,0:495] = df_m.values 

# 2读取disease的特征
df_d2 = pd.read_csv("~/data/hmddv20/3.disease semantic similarity 2/disease semantic similarity matrix 2.txt", sep='\t', header=None)
df_d1 = pd.read_csv("~/data/hmddv20/2.disease semantic similarity 1/disease semantic similarity matrix 1.txt", sep='\t', header=None)
df_d = ((df_d1+df_d2)/2).values
# 用二维numpy存储后383个特征
features[495:878,0:383] = df_d

# 将特征格式转为tensor
torch_features = torch.Tensor(features) 
# 为每个节点分配节点特征向量
g.ndata['feat'] = torch_features
# 为每条边分配一个1维的全1向量,作为标签
g.edata['edges'] = torch.ones(5430, 1)

查看dgl.graph图中的基本信息

print(g.num_nodes())
print(g.num_edges())
# 节点1的出度
print(g.out_degrees(0))
# 节点1的入度
print(g.in_degrees(0))

878
5430
27
0

dgl.graph中的实例化子图、图保存和加载等操作

  1. 从graph中实例化子图-基于节点
# 从原始图的0,1,3号节点中实例化子图
sg1 = g.subgraph([0, 1, 3])
  1. 从graph中实例化子图-基于边
# 从原始图的0,1,3号边中实例化子图
sg2 = g.edge_subgraph([0, 1, 3])
  1. 给每条边添加反向边,原始边的特征会删除,但原始节点的特征会保留
newg = dgl.add_reverse_edges(g)
newg.edges()
newg.edata['edges'] = torch.ones(10860,1)
  1. 图保存和加载
# save graph
dgl.save_graphs('data/graph_md_xsd.dgl',newg) # 相对路径,没有文件夹会自动创建

# load graph
hmdd20_g = dgl.load_graphs('data/graph_md_xsd.dgl')
print(hmdd20_g)

([Graph(num_nodes=878, num_edges=10860,
ndata_schemes={‘feat’: Scheme(shape=(495,), dtype=torch.float32)}
edata_schemes={‘edges’: Scheme(shape=(1,), dtype=torch.float32)})])

方法2:

# 2数据准备
# g为miRNA和disease的同质(一种关联类型)关联图,g0为miRNA、disease异质关联图(多种关联类型),所有样本的疾病节点向量list,所有样本的的基因节点向量
# ndarray: ID【383,383】,IM【495,495】
g, g0,disease_vertices, mirna_vertices, ID, IM, samples = build_graph(
     directory, random_seed) # 构建图像
 # 返回二元异质图dgl,三元异质图dgl,所有样本的疾病节点向量list,所有样本的的基因节点向量list,ndarray疾病特征,基因特征,l基因特征,ndarray所有样本,ndarray [19,3]:ml样本,[677,3]:ld样本
 # return g, g0, sample_disease_vertices, sample_mirna_vertices, ID, IM, samples

 # DGLHeteroGraph:
 #g:Graph(
 #       num_nodes=878,
 #       num_edges=21720,
 #       ndata_schemes={'type': Scheme(shape=(), dtype=torch.int64),
 #                      'd_sim': Scheme(shape=(383,), dtype=torch.float32),
 #                      'm_sim': Scheme(shape=(495,), dtype=torch.float32)}
 #       edata_schemes = {'label': Scheme(shape=(), dtype=torch.float32)}
 #       )
 
 #g0:Graph(
 #       num_nodes=878, num_edges=25078,
 #       ndata_schemes={'type': Scheme(shape=(), dtype=torch.int64), 'd_sim': Scheme(shape=(383,), dtype=torch.float32), 'm_sim': Scheme(shape=(495,), dtype=torch.float32)}
 #       edata_schemes={'dm': Scheme(shape=(), dtype=torch.float32), 'md': Scheme(shape=(), dtype=torch.float32), 'multi_label': Scheme(shape=(), dtype=torch.float32)}
 #       )
 # list : disease_vertices[10860],mirna_vertices[10860]
 # narray : samples[10860*3]

构建数据集并划分

/main.py内构建数据集并划分

划分训练/测试集节点序列

构建正负样本的顶点对,用顶点列表的形式构建训练集合和测试集。

g =  dgl.load_graphs('data/graph_md_xsd.dgl')

# Split edge set for training and testing  划分训练集和测试集的边
u, v = g.edges()

eids = np.arange(g.number_of_edges()) #取0到边的个数的列表
eids = np.random.permutation(eids) # 对一个list进行随机排序

test_size = int(len(eids) * 0.1)   # 测试集1086
train_size = g.number_of_edges() - test_size  #训练集大小9774
test_pos_u, test_pos_v = u[eids[:test_size]], v[eids[:test_size]]
train_pos_u, train_pos_v = u[eids[test_size:]], v[eids[test_size:]]

# Find all negative edges and split them for training and testing #找到所有的负样本并对其进行划分
adj = sp.coo_matrix((np.ones(len(u)), (u.numpy(), v.numpy())))
adj_neg = 1 - adj.todense() - np.eye(g.number_of_nodes())
neg_u, neg_v = np.where(adj_neg != 0)

neg_eids = np.random.choice(len(neg_u), g.number_of_edges()) # 随机取与正样本个数相同的负样本
test_neg_u, test_neg_v = neg_u[neg_eids[:test_size]], neg_v[neg_eids[:test_size]]
train_neg_u, train_neg_v = neg_u[neg_eids[test_size:]], neg_v[neg_eids[test_size:]]

构建用于训练的子图 train_g

在训练的时候,需要在原图中移除测试边集合。你可以通过dgl.remove_edges来移除它

train_g = dgl.remove_edges(g, eids[:test_size])

相关文章:

  • FAST-LIO2代码解析(五)
  • 苦卷28天,阿里P8给我的Alibaba面试手册,终于成功踹开字节大门
  • Vue:v-on、v-bind、v-model、@click、:model用法以及区别(附代码实例)
  • 手写Sping IOC(基于Setter方法注入)
  • 一、SpringBoot前置(从0搭建Maven项目)
  • 宝藏教程:超详细一条龙教程!从零搭建React项目全家桶
  • 网络编程学习总结3
  • 欧姆龙CP1H如何进行PLC远程编程及数据采集
  • CSGO Bway电竞ETERNAL FIRE可以参加BLAST FALL,但MOUZ却错过了
  • 收获tips
  • Vue3+elementplus搭建通用管理系统实例十二:使用通用表格、表单实现对应功能
  • 抖音根据关键词取视频列表 API 返回值说明
  • 120页7万字XX云数据中心解决方案技术方案
  • 保险行业如何实现私域快速增长
  • 计算机网络的基础知识
  • 自己简单写的 事件订阅机制
  • 「面试题」如何实现一个圣杯布局?
  • HashMap剖析之内部结构
  • Hexo+码云+git快速搭建免费的静态Blog
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Less 日常用法
  • ubuntu 下nginx安装 并支持https协议
  • vagrant 添加本地 box 安装 laravel homestead
  • 阿里研究院入选中国企业智库系统影响力榜
  • 笨办法学C 练习34:动态数组
  • 反思总结然后整装待发
  • 高程读书笔记 第六章 面向对象程序设计
  • 蓝海存储开关机注意事项总结
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 浅谈web中前端模板引擎的使用
  • 如何解决微信端直接跳WAP端
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 无服务器化是企业 IT 架构的未来吗?
  • nb
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分类)KNN算法- 参数调优
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .axf 转化 .bin文件 的方法
  • .Net - 类的介绍
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net 按比例显示图片的缩略图
  • .NET 服务 ServiceController
  • :not(:first-child)和:not(:last-child)的用法