如何生成自己的dgl类型数据集

简单介绍一下我想生成的具体数据集内容:

  1. 数据集由10张图组成。
  2. 每张图都有30个节点,且每个节点都有唯一的序号表示。
  3. 在边方面,1-10节点按顺序相连并形成闭环(11-20相连, 21-30相连)。
  4. 每个节点的属性(针对我的问题)有位置信息和速度信息。
    首先随机生成节点的位置信息和速度信息:
import numpy as np
import dgl
# 生成节点的速度矩阵, 并按照一定方式将速度取负
def speed_inital(speed_size, num_graph, n):
    speed = np.random.randint(70, 80, size=speed_size)
    # 将节点在X轴和Y轴方向的速度控制在70-80之间,
    for j in range(num_graph):
        for i in range(n):
            weights_Vx = np.random.randint(-1, 1)
            # 随机将节点在X轴和Y轴方向的速度取负
            if weights_Vx < 0:
                speed[j, i, 0] = speed[j, i, 0] * -1
            weights_Vy = np.random.randint(-1, 1)
            if weights_Vy < 0:
                speed[j, i, 1] = speed[j, i, 1] * -1
        return speed

num_graph = 10 # 定义数据集中图的数量
n = 30  # 定义图的节点数量为30
#设计节点的位置和速度的集合形状, 单位分别为
location_size = [num_graph, n, 2] m和m/s
speed_size = [num_graph, n, 2]

# 使用numpy随机生成节点的特征
location = np.random.randint(0, 6000, size=location_size) # 随机生成无人机的二维坐标, 范围是[0, 6000), 单位是米
speed = speed_inital(speed_size, num_graph, n) 


然后生成OrderedGraph实例,再将节点,节点特征和边添加进去

# 得到OrderedGraph类型、节点图, 其中包含了边和各个节点的特征
# nx_graph包含了节点, 边和节点的属性, 可以通过nx_graph[0].nodes[0]['feat']来查看第一张图中第一个节点的属性
nx_graph, locaiton_dict = graph_draw(num_graph, n, location, speed)

def graph_draw(num_graph, n, location, speed)
:
    nodes = list(range(n))

    # 设计边
    edges = []
    for i in range(9):
        edges.append((i, i + 1))
    edges.append((9, 0))
    for i in range(10, 19):
        edges.append((i, i + 1))
    edges.append((19, 10))
    for i in range(20, 29):
        edges.append((i, i + 1))
    edges.append((29, 20))

    # 创建包含OrderedGraph实例的集合, 后面往该集合中添加图
    nx_graph_set = []
    location_dict = dict()
    for j in range(num_graph):

        location_nodes = np.array(location[j]) # 将location转换为numpy数组,方便后面的操作
        location_dict[j] = dict(zip(nodes, location_nodes)) # 获取节点和坐标之间的映射关系, 用字典表示, 键为节点序号, 键值为节点的坐标
        nlabels = dict(zip(nodes, nodes)) # 标签字典, 构建节点与标识点之间的关系

        # 创建OrderedGraph实例
        nx_graph = nx.OrderedGraph()

        # # 向实例中添加节点以及节点的属性
        for i in range(n):
            nx_graph.add_node(i, feat = (location[j][i][0], location[j][i][1], speed[j][i][0], speed[j][i][1]))
        nx_graph.add_edges_from(edges)  # 向实例中添加边
        nx_graph_set.append(nx_graph) # 将单张图添加到图的集合中
    return nx_graph_set, location_dict

最后将得到的OrderedGraph图转换成dgl图

# 将nx_graph图转换成dgl格式
def turn_GraphTo_dgl(nx_graph, num_graph):
    graph_dgl = []
    # nx_graph是列表, 因为其含有多张图, 所以不能一次性通过from_networkx将图片全部转为dgl图
    for i in range(num_graph):
        graph_dgl_single = dgl.from_networkx(nx_graph=nx_graph[i], node_attrs=['feat'])
        graph_dgl.append(graph_dgl_single)
    return graph_dgl

graph_dgl = turn_GraphTo_dgl(nx_graph, num_graph)

最终得到符合要求的dgl类型数据集,至于数据集的标签,我还没有得到,不过可以通过上面加入节点特征的方式把标签加进去,例如下面代码:

nx_graph.add_node(i, feat = (location[j][i][0], location[j][i][1], speed[j][i][0], speed[j][i][1]), labels = labels[i]) # 表示第j张图中第i个节点的标签为labels[i]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值