dgl.radius_graph

dgl.radius_graph(x, r, p=2, self_loop=False, compute_mode='donot_use_mm_for_euclid_dist', get_distances=False)[source]

从给定点集构造一个半径图,其中邻居位于指定距离内。

此函数将点集的坐标/特征转换为一个双向同构图。点集的坐标指定为一个矩阵,其中行对应点,列对应坐标/特征维度。

返回图的节点对应于点,其中每个点的邻居都位于给定距离内。

此函数需要 PyTorch 后端。

参数:
  • x (Tensor) – 点坐标。可以在 CPU 或 GPU 上。点坐标所在的设备指定了半径图所在的设备,x[i] 对应于半径图中的第 i 个节点。

  • r (float) – 邻居的半径。

  • p (float, 可选) –

    闵可夫斯基度量的幂参数。当 p = 1 时,它等同于曼哈顿距离 (L1 范数);当 p = 2 时,等同于欧几里得距离 (L2 范数)。

    (默认: 2)

  • self_loop (bool, 可选) –

    半径图是否包含自环。

    (默认: False)

  • compute_mode (str, 可选) –

    use_mm_for_euclid_dist_if_necessary - 如果 P > 25 或 R > 25,则使用矩阵乘法计算欧几里得距离 (p = 2) use_mm_for_euclid_dist - 总是使用矩阵乘法计算欧几里得距离 (p = 2) donot_use_mm_for_euclid_dist - 从不使用矩阵乘法计算欧几里得距离 (p = 2)。

    (默认: donot_use_mm_for_euclid_dist)

  • get_distances (bool, 可选) –

    是否返回半径图中对应边的距离。

    (默认: False)

返回:

  • DGLGraph – 构造的图。节点 ID 与 x 的顺序相同。

  • torch.Tensor, 可选 – 构造图中边的距离。距离与边 ID 的顺序相同。

示例

以下示例使用 PyTorch 后端。

>>> import dgl
>>> import torch
>>> x = torch.tensor([[0.0, 0.0, 1.0],
...                   [1.0, 0.5, 0.5],
...                   [0.5, 0.2, 0.2],
...                   [0.3, 0.2, 0.4]])
>>> r_g = dgl.radius_graph(x, 0.75)  # Each node has neighbors within 0.75 distance
>>> r_g.edges()
(tensor([0, 1, 2, 2, 3, 3]), tensor([3, 2, 1, 3, 0, 2]))

get_distances 为 True 时,函数返回半径图和对应边的距离。

>>> x = torch.tensor([[0.0, 0.0, 1.0],
...                   [1.0, 0.5, 0.5],
...                   [0.5, 0.2, 0.2],
...                   [0.3, 0.2, 0.4]])
>>> r_g, dist = dgl.radius_graph(x, 0.75, get_distances=True)
>>> r_g.edges()
(tensor([0, 1, 2, 2, 3, 3]), tensor([3, 2, 1, 3, 0, 2]))
>>> dist
tensor([[0.7000],
        [0.6557],
        [0.6557],
        [0.2828],
        [0.7000],
        [0.2828]])