行特征归一化器

class dgl.transforms.RowFeatNormalizer(subtract_min=False, node_feat_names=None, edge_feat_names=None)[source]

Bases: BaseTransform

node_feat_namesedge_feat_names中给出的特征进行行归一化。

行归一化公式为:

\[x = \frac{x}{\sum_i x_i}\]

其中 \(x\) 表示特征张量的一行。

Parameters:
  • subtract_min (bool) – 如果为 True,在归一化之前将减去整个特征张量的最小值。 默认值:False。 减法将使所有值变为非负数。如果所有值都是负数,归一化后,特征张量的每一行的和将为 1。

  • node_feat_names (list[str], optional) – 要行归一化的节点特征张量的名称。默认值:None,表示不会归一化任何节点特征张量。

  • edge_feat_names (list[str], optional) – 要行归一化的边特征张量的名称。默认值:None,这将不会对任何边特征张量进行归一化。

示例

以下示例使用PyTorch后端。

>>> import dgl
>>> import torch
>>> from dgl import RowFeatNormalizer

案例1:对同质图的特征进行行归一化。

>>> transform = RowFeatNormalizer(subtract_min=True,
...                               node_feat_names=['h'], edge_feat_names=['w'])
>>> g = dgl.rand_graph(5, 20)
>>> g.ndata['h'] = torch.randn((g.num_nodes(), 5))
>>> g.edata['w'] = torch.randn((g.num_edges(), 5))
>>> g = transform(g)
>>> print(g.ndata['h'].sum(1))
tensor([1., 1., 1., 1., 1.])
>>> print(g.edata['w'].sum(1))
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1.])

案例2:对异质图的特征进行行归一化。

>>> g = dgl.heterograph({
...     ('user', 'follows', 'user'): (torch.tensor([1, 2]), torch.tensor([3, 4])),
...     ('player', 'plays', 'game'): (torch.tensor([2, 2]), torch.tensor([1, 1]))
... })
>>> g.ndata['h'] = {'game': torch.randn(2, 5), 'player': torch.randn(3, 5)}
>>> g.edata['w'] = {
...     ('user', 'follows', 'user'): torch.randn(2, 5),
...     ('player', 'plays', 'game'): torch.randn(2, 5)
... }
>>> g = transform(g)
>>> print(g.ndata['h']['game'].sum(1), g.ndata['h']['player'].sum(1))
tensor([1., 1.]) tensor([1., 1., 1.])
>>> print(g.edata['w'][('user', 'follows', 'user')].sum(1),
...     g.edata['w'][('player', 'plays', 'game')].sum(1))
tensor([1., 1.]) tensor([1., 1.])