RowFeatNormalizer

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

基类:BaseTransform

对在 node_feat_namesedge_feat_names 中指定的特征进行行归一化。

行归一化公式为

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

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

参数:
  • 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.])