mindspore_gl.sampling

图数据的采样API。

mindspore_gl.sampling.k_hop_subgraph(node_idx, num_hops, adj_coo, node_count, relabel_nodes=False, flow='source_to_target')[源代码]

HomoGraph上的K跳采样。

参数:
  • node_idx (int, list, tuple or numpy.ndarray) - 围绕 node_idx 采样子图。

  • num_hops (int) - 在子图上采样 num_hops 跳。

  • adj_coo (numpy.ndarray) - 输入图的邻接矩阵。

  • node_count (int) - 节点数。

  • relabel_nodes (bool) - 节点索引是否需要重新标签。默认值:False。

  • flow (str, 可选) - 访问方向。默认值:’source_to_target’。

    • ‘source_to_target’: 从源节点到目标节点。

    • ‘target_to_source’: 从目标节点到源节点。

返回:

res(dict),有4个键“subset”、“ad_coo”、“inv”、“edge_mask”,其中,

  • subset (numpy.ndarray) - 采样K跳的子图节点idx。

  • ad_coo (numpy.ndarray) - 采样K跳的子图邻接矩阵。

  • inv (list) - 从 node_idx 中的节点索引到其新位置的映射。

  • edge_mask (numpy.array) - 边掩码,指示保留哪些边。

异常:
  • TypeError - 如果 num_hopsnum_hops 不是正整数。

  • TypeError - 如果 num_hops 不是bool。

  • ValueError - 如果 flow 不是source_to_target或target_to_source。

支持平台:

Ascend GPU

样例:

>>> from mindspore_gl.graph import MindHomoGraph
>>>from mindspore_gl.sampling import k_hop_subgraph
>>> graph = MindHomoGraph()
>>> coo_array = np.array([[0, 1, 1, 2, 3, 0, 3, 4, 2, 5],
...                       [1, 0, 2, 1, 0, 3, 4, 3, 5, 2]])
>>> graph.set_topo_coo(coo_array)
>>> graph.node_count = 6
>>> graph.edge_count = 10
>>> res = k_hop_subgraph([0, 3], 2, graph.adj_coo, graph.node_count,
... relabel_nodes=True)
>>> print(res)
{'subset': array([0, 1, 2, 3, 4]), 'adj_coo': array([[0, 1, 1, 2, 3, 0, 3, 4],
[1, 0, 2, 1, 0, 3, 4, 3]]), 'inv': array([0, 3]), 'edge_mask': array([ True,  True,  True,  True,  True,  True,
True,  True, False, False])}
mindspore_gl.sampling.negative_sample(positive, node, num_neg_samples, mode='undirected', re='more')[源代码]

输入所有正样本边集,并指定负样本长度。 然后返回相同长度的负样本边集,并且不会重复正样本。 可以选择考虑自循环、有向图或无向图操作。

参数:
  • positive (list or numpy.ndarray) - 所有正样本边。

  • node (int) - 节点数。

  • num_neg_samples (int) - 负样本长度。

  • mode (str, 可选) - 运算矩阵的类型。默认值:’undirected’。

    • undirected: 无向图。

    • bipartite: 二部图。

    • other: 其他类型图。

  • re (str, 可选) - 输入数据类型。默认值:’more’。

    • more: positive 数组shape为 \((data\_length, 2)\)

    • other: positive 数组shape为 \((2, data\_length)\)

返回:

数组,负采样边集,shape为 \((num\_neg\_samples, 2)\)

异常:
  • TypeError - 如果 positive 不是List或numpy.ndarry。

  • TypeError - 如果 node 不是正整数。

  • TypeError - 如果 re 不在”more”或”other”中。

  • ValueError - 如果 mode 不是”bipartite”、”undirected”或”other”。

支持平台:

Ascend GPU

样例:

>>> from mindspore_gl.sampling import negative_sample
>>> positive = [[1,2],[2,3]]
>>> neg_len = 4
>>> neg = negative_sample(positive, 4, neg_len)
>>> print(neg)
[[0 3]
[0 2]
[1 3]
[0 1]]
mindspore_gl.sampling.random_walk_unbias_on_homo(homo_graph: mindspore_gl.graph.MindHomoGraph, seeds: numpy.ndarray, walk_length: int)[源代码]

同构图上的随机游走采样。

参数:
  • homo_graph (mindspore_gl.graph.MindHomoGraph) - 采样的源图。

  • seeds (numpy.ndarray) - 用于采样的随机种子。

  • walk_length (int) - 采样路径长度。

异常:
  • TypeError - 如果 walk_length 不是正整数。

  • TypeError - 如果 seeds 不是numpy.int32。

返回:

数组,示例节点 \((len(seeds), walk\_length)\)

支持平台:

Ascend GPU

样例:

>>> import numpy as np
>>> import networkx
>>> from scipy.sparse import csr_matrix
>>> from mindspore_gl.graph import MindHomoGraph, CsrAdj
>>> from mindspore_gl.sampling.randomwalks import random_walk_unbias_on_homo
>>> node_count = 10000
>>> edge_prob = 0.1
>>> graph = networkx.generators.random_graphs.fast_gnp_random_graph(node_count, edge_prob)
>>> edge_array = np.transpose(np.array(list(graph.edges)))
>>> row = edge_array[0]
>>> col = edge_array[1]
>>> data = np.zeros(row.shape)
>>> csr_mat = csr_matrix((data, (row, col)), shape=(node_count, node_count))
>>> generated_graph = MindHomoGraph()
>>> node_dict = {idx: idx for idx in range(node_count)}
>>> edge_count = col.shape[0]
>>> edge_ids = np.array(list(range(edge_count))).astype(np.int32)
>>> generated_graph.set_topo(CsrAdj(csr_mat.indptr.astype(np.int32), csr_mat.indices.astype(np.int32)),
... node_dict, edge_ids)
>>> nodes = np.arange(0, node_count)
>>> out = random_walk_unbias_on_homo(homo_graph=generated_graph, seeds=nodes[:5].astype(np.int32),
... walk_length=10)
>>> print(out)
# results will be random for suffle
[[   0 9493 8272 1251 3922 4180  211 1083 4198 9981 7669]
[   1 1585 1308 4703 1115 4989 9365 1098 1618 5987 8312]
[   2 2352 7214 5956 2184 1573 1352 7005 2325 6211 8667]
[   3 8723 5645 3691 4857 5501  113 4140 6666 2282 1248]
[   4 4354 9551 5224 3156 8693  346 8899 6046 6011 5310]]
mindspore_gl.sampling.sage_sampler_on_homo(homo_graph: mindspore_gl.graph.MindHomoGraph, seeds, neighbor_nums: List[int])[源代码]

MindHomoGraph上的GraphSage采样。

参数:
  • homo_graph (mindspore_gl.graph.MindHomoGraph) - 输入图。

  • seeds (numpy.ndarray) - 邻居采样的起始节点。

  • neighbor_nums (List) - 每跳的邻居数量。

返回:
  • layered_edges_{idx}(numpy.ndarray),第idx跳时采样的重编号边数组。

  • layered_eids_{idx}(numpy.ndarray),第idx跳时采样的边上点的重编号ID。

  • all_nodes,采样到的所有节点的ID。

  • seeds_idx,重编号的种子的ID。

异常:
  • TypeError - 如果 homo_graph 不是MindHomoGraph类。

  • TypeError - 如果 seeds 不是numpy.array。

  • TypeError - 如果 neighbor_nums 不是List。

支持平台:

Ascend GPU

样例:

>>> import networkx
>>> import numpy as np
>>> from scipy.sparse import csr_matrix
>>> from mindspore_gl.graph import MindHomoGraph, CsrAdj
>>> from mindspore_gl.sampling.neighbor import sage_sampler_on_homo
>>> node_count = 10
>>> edge_prob = 0.3
>>> graph = networkx.generators.random_graphs.fast_gnp_random_graph(node_count, edge_prob, seed=1)
>>> edge_array = np.transpose(np.array(list(graph.edges)))
>>> row = edge_array[0]
>>> col = edge_array[1]
>>> data = np.ones(row.shape)
>>> csr_mat = csr_matrix((data, (row, col)), shape=(node_count, node_count))
>>> generated_graph = MindHomoGraph()
>>> node_dict = {idx: idx for idx in range(node_count)}
>>> edge_count = col.shape[0]
>>> edge_ids = np.array(list(range(edge_count))).astype(np.int32)
>>> generated_graph.set_topo(CsrAdj(csr_mat.indptr.astype(np.int32), csr_mat.indices.astype(np.int32)),        ... node_dict, edge_ids)
>>> nodes = np.arange(0, node_count)
>>> res = sage_sampler_on_homo(homo_graph=generated_graph, seeds=nodes[:3].astype(np.int32),        ... neighbor_nums=[2, 2])
>>> print(res)
{'seeds_idx': array([0, 1, 2], dtype=int32), 'all_nodes': array([0, 1, 2, 4, 5, 6, 7, 8, 9], dtype=int32),
'layered_edges_0': array([[0, 0, 1, 1, 2], [1, 3, 4, 5, 4]], dtype=int32),
'layered_eids_0': array([[0, 0, 1, 1, 2], [1, 3, 4, 5, 4]], dtype=int32),
'layered_edges_1': array([[1, 1, 3, 3, 4, 5, 5], [4, 5, 7, 8, 6, 7, 8]], dtype=int32),
'layered_eids_1': array([[1, 1, 3, 3, 4, 5, 5], [4, 5, 7, 8, 6, 7, 8]], dtype=int32)}