如何将 networkx 中的图形加载到 PyTorch 几何图形中并设置节点特征和标签?
How to load in graph from networkx into PyTorch geometric and set node features and labels?
目标: 我正在尝试将图 FROM networkx 导入 PyTorch 几何并 设置标签和节点特征.
(这个在Python)
问题:
- 我该怎么做[从 networkx 到 PyTorch geometric 的转换]? (大概是通过使用
from_networkx
函数)
- 如何传递节点特征和标签?(更重要的问题)
我看到一些 other/previous post 有这个问题,但他们没有回答(如果我错了请纠正我)。
尝试:(我刚刚在下面使用了一个不切实际的例子,因为我不能post这里有任何真实的东西)
让我们想象一下,我们正在尝试对一组汽车进行图形学习任务(例如节点分类)(正如我所说的那样不太现实)。也就是说,我们有一组汽车、一个邻接矩阵和一些特征(例如年底的价格)。我们要预测节点标签(即汽车品牌)。
我将使用以下邻接矩阵:(抱歉,无法使用 Latex 对其进行格式化)
A = [(0, 1, 0, 1, 1), (1, 0, 1, 1, 0), (0, 1, 0, 0, 1), (1, 1, 0 , 0, 0), (1, 0, 1, 0, 0)]
这是代码(针对 Google Colab 环境):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
from torch_geometric.utils.convert import to_networkx, from_networkx
import torch
!pip install torch-scatter torch-sparse torch-cluster torch-spline-conv torch-geometric -f https://data.pyg.org/whl/torch-1.10.0+cpu.html
# Make the networkx graph
G = nx.Graph()
# Add some cars (just do 4 for now)
G.add_nodes_from([
(1, {'Brand': 'Ford'}),
(2, {'Brand': 'Audi'}),
(3, {'Brand': 'BMW'}),
(4, {'Brand': 'Peugot'}),
(5, {'Brand': 'Lexus'}),
])
# Add some edges
G.add_edges_from([
(1, 2), (1, 4), (1, 5),
(2, 3), (2, 4),
(3, 2), (3, 5),
(4, 1), (4, 2),
(5, 1), (5, 3)
])
# Convert the graph into PyTorch geometric
pyg_graph = from_networkx(G)
所以这正确地将 networkx 图转换为 PyTorch 几何图形。但是,我仍然不知道如何正确设置标签。
每个节点的品牌值已转换并存储在:
pyg_graph.Brand
下面,我刚刚为每个节点制作了一些长度为 5 的随机 numpy 数组(假装这些是真实的)。
ford_prices = np.random.randint(100, size = 5)
lexus_prices = np.random.randint(100, size = 5)
audi_prices = np.random.randint(100, size = 5)
bmw_prices = np.random.randint(100, size = 5)
peugot_prices = np.random.randint(100, size = 5)
这让我想到了主要问题:
- 如何将价格设置为该图的节点特征?
- 如何设置节点的标签? (训练网络时我需要从
pyg_graph.Brand
中删除标签吗?)
提前致谢,节日快乐。
最简单的方法是将所有信息添加到networkx graph中,然后按照您需要的方式直接创建它。我猜您想使用一些图形神经网络。那么你想要像下面这样的东西。
- 您可能希望使用分类表示而不是文本作为标签,例如1代表福特。
- 如果你想匹配“通常的约定”。然后你命名你的输入特征
x
和你的 labels/ground 真相 y
.
- 将数据拆分为训练和测试是通过掩码完成的。所以该图仍然包含所有信息,但只有一部分用于训练。查看
PyTorch Geometric introduction
示例,它使用 Cora 数据集。
import networkx as nx
import numpy as np
import torch
from torch_geometric.utils.convert import from_networkx
# Make the networkx graph
G = nx.Graph()
# Add some cars (just do 4 for now)
G.add_nodes_from([
(1, {'y': 1, 'x': 0.5}),
(2, {'y': 2, 'x': 0.2}),
(3, {'y': 3, 'x': 0.3}),
(4, {'y': 4, 'x': 0.1}),
(5, {'y': 5, 'x': 0.2}),
])
# Add some edges
G.add_edges_from([
(1, 2), (1, 4), (1, 5),
(2, 3), (2, 4),
(3, 2), (3, 5),
(4, 1), (4, 2),
(5, 1), (5, 3)
])
# Convert the graph into PyTorch geometric
pyg_graph = from_networkx(G)
print(pyg_graph)
# Data(edge_index=[2, 12], x=[5], y=[5])
print(pyg_graph.x)
# tensor([0.5000, 0.2000, 0.3000, 0.1000, 0.2000])
print(pyg_graph.y)
# tensor([1, 2, 3, 4, 5])
print(pyg_graph.edge_index)
# tensor([[0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4],
# [1, 3, 4, 0, 2, 3, 1, 4, 0, 1, 0, 2]])
# Split the data
train_ratio = 0.2
num_nodes = pyg_graph.x.shape[0]
num_train = int(num_nodes * train_ratio)
idx = [i for i in range(num_nodes)]
np.random.shuffle(idx)
train_mask = torch.full_like(pyg_graph.y, False, dtype=bool)
train_mask[idx[:num_train]] = True
test_mask = torch.full_like(pyg_graph.y, False, dtype=bool)
test_mask[idx[num_train:]] = True
print(train_mask)
# tensor([ True, False, False, False, False])
print(test_mask)
# tensor([False, True, True, True, True])
目标: 我正在尝试将图 FROM networkx 导入 PyTorch 几何并 设置标签和节点特征.
(这个在Python)
问题:
- 我该怎么做[从 networkx 到 PyTorch geometric 的转换]? (大概是通过使用
from_networkx
函数) - 如何传递节点特征和标签?(更重要的问题)
我看到一些 other/previous post 有这个问题,但他们没有回答(如果我错了请纠正我)。
尝试:(我刚刚在下面使用了一个不切实际的例子,因为我不能post这里有任何真实的东西)
让我们想象一下,我们正在尝试对一组汽车进行图形学习任务(例如节点分类)(正如我所说的那样不太现实)。也就是说,我们有一组汽车、一个邻接矩阵和一些特征(例如年底的价格)。我们要预测节点标签(即汽车品牌)。
我将使用以下邻接矩阵:(抱歉,无法使用 Latex 对其进行格式化)
A = [(0, 1, 0, 1, 1), (1, 0, 1, 1, 0), (0, 1, 0, 0, 1), (1, 1, 0 , 0, 0), (1, 0, 1, 0, 0)]
这是代码(针对 Google Colab 环境):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
from torch_geometric.utils.convert import to_networkx, from_networkx
import torch
!pip install torch-scatter torch-sparse torch-cluster torch-spline-conv torch-geometric -f https://data.pyg.org/whl/torch-1.10.0+cpu.html
# Make the networkx graph
G = nx.Graph()
# Add some cars (just do 4 for now)
G.add_nodes_from([
(1, {'Brand': 'Ford'}),
(2, {'Brand': 'Audi'}),
(3, {'Brand': 'BMW'}),
(4, {'Brand': 'Peugot'}),
(5, {'Brand': 'Lexus'}),
])
# Add some edges
G.add_edges_from([
(1, 2), (1, 4), (1, 5),
(2, 3), (2, 4),
(3, 2), (3, 5),
(4, 1), (4, 2),
(5, 1), (5, 3)
])
# Convert the graph into PyTorch geometric
pyg_graph = from_networkx(G)
所以这正确地将 networkx 图转换为 PyTorch 几何图形。但是,我仍然不知道如何正确设置标签。
每个节点的品牌值已转换并存储在:
pyg_graph.Brand
下面,我刚刚为每个节点制作了一些长度为 5 的随机 numpy 数组(假装这些是真实的)。
ford_prices = np.random.randint(100, size = 5)
lexus_prices = np.random.randint(100, size = 5)
audi_prices = np.random.randint(100, size = 5)
bmw_prices = np.random.randint(100, size = 5)
peugot_prices = np.random.randint(100, size = 5)
这让我想到了主要问题:
- 如何将价格设置为该图的节点特征?
- 如何设置节点的标签? (训练网络时我需要从
pyg_graph.Brand
中删除标签吗?)
提前致谢,节日快乐。
最简单的方法是将所有信息添加到networkx graph中,然后按照您需要的方式直接创建它。我猜您想使用一些图形神经网络。那么你想要像下面这样的东西。
- 您可能希望使用分类表示而不是文本作为标签,例如1代表福特。
- 如果你想匹配“通常的约定”。然后你命名你的输入特征
x
和你的 labels/ground 真相y
. - 将数据拆分为训练和测试是通过掩码完成的。所以该图仍然包含所有信息,但只有一部分用于训练。查看
PyTorch Geometric introduction
示例,它使用 Cora 数据集。
import networkx as nx
import numpy as np
import torch
from torch_geometric.utils.convert import from_networkx
# Make the networkx graph
G = nx.Graph()
# Add some cars (just do 4 for now)
G.add_nodes_from([
(1, {'y': 1, 'x': 0.5}),
(2, {'y': 2, 'x': 0.2}),
(3, {'y': 3, 'x': 0.3}),
(4, {'y': 4, 'x': 0.1}),
(5, {'y': 5, 'x': 0.2}),
])
# Add some edges
G.add_edges_from([
(1, 2), (1, 4), (1, 5),
(2, 3), (2, 4),
(3, 2), (3, 5),
(4, 1), (4, 2),
(5, 1), (5, 3)
])
# Convert the graph into PyTorch geometric
pyg_graph = from_networkx(G)
print(pyg_graph)
# Data(edge_index=[2, 12], x=[5], y=[5])
print(pyg_graph.x)
# tensor([0.5000, 0.2000, 0.3000, 0.1000, 0.2000])
print(pyg_graph.y)
# tensor([1, 2, 3, 4, 5])
print(pyg_graph.edge_index)
# tensor([[0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4],
# [1, 3, 4, 0, 2, 3, 1, 4, 0, 1, 0, 2]])
# Split the data
train_ratio = 0.2
num_nodes = pyg_graph.x.shape[0]
num_train = int(num_nodes * train_ratio)
idx = [i for i in range(num_nodes)]
np.random.shuffle(idx)
train_mask = torch.full_like(pyg_graph.y, False, dtype=bool)
train_mask[idx[:num_train]] = True
test_mask = torch.full_like(pyg_graph.y, False, dtype=bool)
test_mask[idx[num_train:]] = True
print(train_mask)
# tensor([ True, False, False, False, False])
print(test_mask)
# tensor([False, True, True, True, True])