目录
子图提取
1.k_hop_subgraph:
提取给定节点node_idx
经过num_hops
跳到达的所有节点组成的子图(包括node_idx
本身)。
(1)输入参数解释:
-
node_idx – 目标节点
-
num_hops (int) – 跳的步数
-
edge_index (LongTensor) – 原图的边的索引
-
relabel_nodes (bool, optional) – 如果设置为True,将会从0开始重新标记节点. (default: False)
-
num_nodes (int, optional) – 原图包含的节点数 i.e.
max_val + 1
ofedge_index
. (default: None) -
flow (str, optional) – The flow direction of �-hop aggregation (
"source_to_target"
or"target_to_source"
). (default:"source_to_target"
) -
directed (bool, optional) – If set to False, will include all edges between all sampled nodes. (default: True)
(2)返回参数
- 子图中涉及的节点集,包含目标节点 ,顺序排列;
- 子图的边的索引( (如果 relabel_nodes=True只作用于edge_index,那么返回的就是重新标记后的节点索引)
- 返回的是:node_idx(目标节点)在返回的节点集的位置索引(有多个node_idx就返回多个位置索引)
- 布尔数组,显示子图涉及的边在原图中边的一个对应。
解析关键代码:
subset, inv = torch.cat(subsets).unique(return_inverse=True)
inv = inv[:node_idx.numel()]
- subsets: 是一个list, 开始就把node_idx存上,然会依次存放node_idx的一步邻居....n跳邻居,注意会有重复,比如二跳的时候会将node_idx也存上,偶数步就会重复的存node_idx,还有就是,如果一个点需要3步就可以覆盖全图,选择的跳数是5,那么多出来的就会往回走,存的全是已经保存的点。
torch.cat(subsets)
:这行代码使用torch.cat
函数将列表subsets
中的张量沿着默认的第0维度(行)拼接在一起。结果就是tensor([3, 2, 1, 3, 0, 2, 2, 1, 1, 3])
。torch.cat(subsets).unique(return_inverse=True)
:接下来,使用unique
函数找到向量中的唯一值。返回的subset
张量是包含唯一值的向量,即tensor([0, 1, 2, 3])
。同时,return_inverse=True
选项表示还会返回一个索引张量inv
,该张量允许重构原始向量。即inv=tensor([3, 2, 1, 3, 0, 2, 2, 1, 1, 3]),(允许重构原始向量:在例子中,唯一值向量是tensor([0, 1, 2, 3])
,索引张量是tensor([3, 2, 1, 3, 0, 2, 2, 1, 1, 3])
。如果你想通过索引张量重新构造原始向量,你可以按照inv
中的索引顺序,从唯一值向量中取出相应位置的元素。这样就能够还原原始向量。)- ive 它告诉你原始向量中的每个元素在唯一值向量
subset
中的位置。 - 然后是 inv = inv[:node_idx.numel()],
numel()
方法返回张量中的元素总数,inv[:node_idx.numel()] 返回在inv的前node_idx.numel()个元素,也就是node_idx在在唯一值向量subset
中的位置索引集。
例如:
edge_index = torch.tensor([[0, 1, 1, 2, 2, 3],
[1, 0, 2, 1, 3, 2]], dtype=torch.long)
# 选择源节点
source_node = 3
# 指定 k,这里选择 1 跳邻居
k = 4
# 提取 k-跳子图
subgraph, mapping, _, _= k_hop_subgraph(source_node, k, edge_index, relabel_nodes=True)
注意:返回的节点集是来自原图的节点索引,顺序排列,edge_index就是原图中得到,只有它受到是否重标记的影响,然后就是中心节点位置索引,子图边在原图中的对应。
2.subgraph
根据给定的节点集合subset
来抽取原图中包含这些节点的子图。
(1)输入参数解释:
-
subset (LongTensor, BoolTensor or [int]) – 目标节点集
-
edge_index (LongTensor) – 原图边的索引
-
edge_attr (Tensor, optional) – 边的权重或是 多维边的特征. (default: None)
-
relabel_nodes (bool, optional) – If set to True, the resulting
edge_index
will be relabeled to hold consecutive indices starting from zero. (default: False) -
num_nodes (int, optional) – The number of nodes, i.e.
max_val + 1
ofedge_index
. (default: None) -
return_edge_mask (bool, optional) – If set to True, will return the edge mask to filter out additional edge features. (default: False)
(2)返回参数
- 第一个是子图边的索引-edge_index
- 第二个是子图边的-edge_attr