from torch_geometric.utils import k_hop_subgraph和subgraph

目录

子图提取

1.k_hop_subgraph:  

(1)输入参数解释:

(2)返回参数

2.subgraph

(1)输入参数解释:

(2)返回参数


子图提取

1.k_hop_subgraph:  

提取给定节点node_idx经过num_hops跳到达的所有节点组成的子图(包括node_idx本身)。

(1)输入参数解释:

  • node_idx – 目标节点

  • num_hops (int) – 跳的步数

  • edge_index (LongTensor) – 原图的边的索引

  • relabel_nodes (booloptional) – 如果设置为True,将会从0开始重新标记节点. (default: False)

  • num_nodes (intoptional) – 原图包含的节点数  i.e. max_val + 1 of edge_index. (default: None)

  • flow (stroptional) – The flow direction of �-hop aggregation ("source_to_target" or "target_to_source"). (default: "source_to_target")

  • directed (booloptional) – 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)

from torch_geometric.utils import k_hop_subgraph和subgraph_第1张图片

from torch_geometric.utils import k_hop_subgraph和subgraph_第2张图片

 注意:返回的节点集是来自原图的节点索引,顺序排列,edge_index就是原图中得到,只有它受到是否重标记的影响,然后就是中心节点位置索引,子图边在原图中的对应。

2.subgraph

根据给定的节点集合subset来抽取原图中包含这些节点的子图。

(1)输入参数解释:

  • subset (LongTensorBoolTensor or [int]) – 目标节点集

  • edge_index (LongTensor) – 原图边的索引

  • edge_attr (Tensoroptional) – 边的权重或是 多维边的特征. (default: None)

  • relabel_nodes (booloptional) – If set to True, the resulting edge_index will be relabeled to hold consecutive indices starting from zero. (default: False)

  • num_nodes (intoptional) – The number of nodes, i.e. max_val + 1 of edge_index. (default: None)

  • return_edge_mask (booloptional) – If set to True, will return the edge mask to filter out additional edge features. (default: False)

(2)返回参数

  • 第一个是子图边的索引-edge_index 
  • 第二个是子图边的-edge_attr 

你可能感兴趣的:(数据库)