图采样、随机游走、subgraph的实现

诸神缄默不语-个人CSDN博文目录

本博文主要关注如何用代码实现图采样、随机游走、subgraph(为什么这些东西放在一起写,我感觉还蛮直觉的)。
随机游走和subgraph我之前都写过不少博文了,可以参考↑
这个主要是我前年还在干GNN时候接到过一个做数据集的项目,所以需要实现这些小功能。不过后来我不干那个项目了,也不干GNN了……然后这是我最近突然翻出来我当年写的有道云笔记,所以总结整理一下发出来分享技术。

关于subgraph还可以参考维基百科:Induced subgraph - Wikipedia

文章目录

  • 1. 图采样
  • 2. 随机游走
  • 3. subgraph

1. 图采样

随机游走算是一种图采样的方式吧,所以放到一块写。

  1. 主要参考这个项目(用NetworkX实现的):Ashish7129/Graph_Sampling: Graph Sampling is a python package containing various approaches which samples the original graph according to different sample sizes.
    1. sampling by exploration(用随机游走或者traversal实现采样)
      1. Simple Random Walk Sampling (SRW)(node2vec差不多就是这个意思)
        图采样、随机游走、subgraph的实现_第1张图片
        随机选择一个起始节点,随机游走直至达到指定长度
        这个的实现方式:每走一步,抽样这个邻居节点,及这两个节点之间产生的边。考虑到图的连通性,如果每T次迭代新增的节点数少于growth_size,就换一个起始节点重新开始
      2. Random Walk Sampling with Fly Back Probability (RWF):RWR版本
      3. Induced Subgraph Random Walk Sampling (ISRW):SWR找出随机游走产生的节点序列后返回node-induced subgraph
        用NetworkX内置的subgraph函数实现的
      4. Snowball Sampling (SB) (这个缩写我很难评)
        每次抽样k个节点的BFS:随机抽k个节点作为第一stage,每次抽这一stage的每个节点的k个邻居(如果邻居小于k个,就抽所有邻居)形成下一stage的节点。
        (stage就是epoch,我忘了我当时学BFS的时候用的是哪个版本的教程了反正用的就是这个术语,力扣或者DPV吧反正)
      5. ForestFire Sampling (FF):随机抽取一个节点烧了(加入采样图),点燃外向边,被点燃的边的另一头的节点有一定概率被烧(加入采样图)。没得烧了就换个随机节点。
        (这个函数感觉原项目中实现得不够有随机性,是选择了一个节点的前random.randint个邻居。但是我记得NetworkX的邻居排列好像是不随机的,所以这个代码可能不够有随机性)
      6. Metropolis Hastings Random Walk Sampling (MHRW):首先选一个节点(度数不能是0)作为种子 v v v,然后定义proposal function Q ( v ) = k v Q(v)=k_v Q(v)=kv,在 v v v的邻居中随机选一个 w w w、并生成一个随机数 ρ ∈ U ( 0 , 1 ) \rho\in U(0,1) ρU(0,1),如果 ρ ≤ Q ( v ) / Q ( w ) \rho ≤ Q(v)/Q(w) ρQ(v)/Q(w),就将新节点加入采样,否则就停留在 v v v
        图采样、随机游走、subgraph的实现_第2张图片
        感觉是加上一点概率采样、鼓励度数小的节点被抽样到的随机游走采样。
      7. Induced Metropolis Hastings Random Walk Sampling (Induced-MHRW):MHRW,但是用MHRW的节点生成的induced subgraph
    2. Edge Sampling
      1. Total Induction Edge Sampling (TIES)1:就直接从原图中随机抽边,然后生成edge-induced subgraph,然后再用这些节点生成node-induced subgraph
  2. 终止条件:达到最大迭代数、达到最大节点/边数(或节点/边在原节点/边中所占的数量比例)
  3. 参考相关采样算法进行补充:
    1. 随机点采样(Random Node, RN)
      图采样、随机游走、subgraph的实现_第3张图片
    2. 随机边采样(Random Edge, RE)图采样、随机游走、subgraph的实现_第4张图片
    3. 双网络图采样(Bi-graph Random Walk, BRW):针对有向图,在种子节点上先在出度和入度之间二选一,然后再在选中方向上随机选择一个节点
      图采样、随机游走、subgraph的实现_第5张图片
  4. 其他抽样方法(我都还没看,哈哈)
    1. GraphSAINT
      官方GitHub项目:https://github.com/GraphSAINT/GraphSAINT(我看这个项目里也实现了好几种sampler)
    2. Sampling from Large Graphs
    3. Network Sampling via Edge-based Node Selection with Graph Induction
    4. Sampling methods for efficient training of graph convolutional networks: A survey
      (这个大概应该指的是类似GraphSAGE那种……就也算是采样边)
    5. PinSage
      可以参考博文:PinSage:GCN在商业推荐系统首次成功应用

2. 随机游走

torch_cluster的random_walk(返回节点序列) https://github.com/rusty1s/pytorch_cluster/blob/86f2e4a0f6bff4ad966787e0e3902f8bcdfa64a0/README.md#randomwalk-sampling
这个返回值是有重复的。可以看看别的随机游走采样的实现方式里面如何处理重复节点的

3. subgraph

  1. node-induced subgraph(已知节点索引)
    如果已知邻接矩阵,没什么好说的,直接切片就行
    如果已知edge_index,参考PyG的subgraph函数(https://pytorch-geometric.readthedocs.io/en/latest/_modules/torch_geometric/utils/subgraph.html)的实现方式
    NetworkX内置subgraph函数
  2. edge-induced subgraph(已知edge_index的话也很直觉)
  3. k-hop subgraph
    PyG的实现:https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch_geometric.utils.k_hop_subgraph

  1. Graph_Sampling官方给的参考文献是这篇:Network Sampling via Edge-based Node Selection with Graph Induction ↩︎

你可能感兴趣的:(人工智能学习笔记,GNN,图神经网络,图采样,随机游走,random,walk,RW,subgraph)