SIGNDiffusion

class dgl.transforms.SIGNDiffusion(k, in_feat_name='feat', out_feat_name='out_feat', eweight_name=None, diffuse_op='raw', alpha=0.2)[source]

Bases: BaseTransform

The diffusion operator from SIGN: Scalable Inception Graph Neural Networks

It performs node feature diffusion with TX,β‹―,TkX, where T is a diffusion matrix and X is the input node features.

Specifically, this module provides four options for T.

raw: raw adjacency matrix A

rw: random walk (row-normalized) adjacency matrix Dβˆ’1A, where D is the degree matrix.

gcn: symmetrically normalized adjacency matrix used by GCN, Dβˆ’1/2ADβˆ’1/2

ppr: approximate personalized PageRank used by APPNP

H0=XHl+1=(1βˆ’Ξ±)(Dβˆ’1/2ADβˆ’1/2Hl)+Ξ±X

This module only works for homogeneous graphs.

Parameters:
  • k (int) – The maximum number of times for node feature diffusion.

  • in_feat_name (str, optional) – g.ndata[{in_feat_name}] should store the input node features. Default: β€˜feat’

  • out_feat_name (str, optional) – g.ndata[{out_feat_name}_i] will store the result of diffusing input node features for i times. Default: β€˜out_feat’

  • eweight_name (str, optional) – Name to retrieve edge weights from g.edata. Default: None, treating the graph as unweighted.

  • diffuse_op (str, optional) – The diffusion operator to use, which can be β€˜raw’, β€˜rw’, β€˜gcn’, or β€˜ppr’. Default: β€˜raw’

  • alpha (float, optional) – Restart probability if diffuse_op is 'ppr', which commonly lies in [0.05,0.2]. Default: 0.2

Example

>>> import dgl
>>> import torch
>>> from dgl import SIGNDiffusion
>>> transform = SIGNDiffusion(k=2, eweight_name='w')
>>> num_nodes = 5
>>> num_edges = 20
>>> g = dgl.rand_graph(num_nodes, num_edges)
>>> g.ndata['feat'] = torch.randn(num_nodes, 10)
>>> g.edata['w'] = torch.randn(num_edges)
>>> transform(g)
Graph(num_nodes=5, num_edges=20,
      ndata_schemes={'feat': Scheme(shape=(10,), dtype=torch.float32),
                     'out_feat_1': Scheme(shape=(10,), dtype=torch.float32),
                     'out_feat_2': Scheme(shape=(10,), dtype=torch.float32)}
      edata_schemes={'w': Scheme(shape=(), dtype=torch.float32)})