缩放节点属性

简介

缩放属性可用于预处理节点属性以进行模型训练,或对 PageRank 分数等算法结果进行后处理。它根据指定的缩放器对节点属性进行缩放。可以同时缩放多个属性,并以列表属性的形式返回。

输入属性必须是数字或数字列表。所有列表必须具有相同的大小。输出属性始终是一个列表。输出列表的大小等于输入属性长度之和。也就是说,如果输入属性是两个标量数值属性和一个长度为 3 的列表属性,则输出列表的总长度为 5。

如果节点的某个属性缺少值,则该节点将被排除在该属性的缩放之外。它将获得 NaN 的输出值。这同样适用于列表属性。

支持多种用于缩放属性的缩放器。这些缩放器可以使用 scaler 配置参数进行配置。

列表属性按索引逐项进行缩放。详情请参阅列表示例

在以下公式中,p 表示包含图中所有节点的所有属性值的向量。

最小-最大缩放器 (Min-max scaler)

将所有属性值缩放到 [0, 1] 范围内,其中最小值对应的缩放值为 0,最大值对应的缩放值为 1,公式如下:

scaled p equals p minus minimum of p divided by maximum of p minus minimum of p

当使用此缩放器时,最小值和最大值将作为统计信息进行报告。

最大值缩放器 (Max scaler)

将所有属性值缩放到 [-1, 1] 范围内,其中绝对值最大者对应的缩放值为 1,公式如下:

scaled p equals p divided by the maximum of absolute p

当使用此缩放器时,绝对最大值将作为统计信息进行报告。

均值缩放器 (Mean scaler)

将所有属性值缩放到 [-1, 1] 范围内,其中平均值对应的缩放值为 0

scaled p equals p minus average of p divided by maximum of p minus minimum of p

当使用此缩放器时,最小值、最大值和平均值将作为统计信息进行报告。

对数缩放器 (Log scaler)

使用自然对数转换所有属性值。C 表示一个可配置的常数偏移量,可用于避免值空间中的负数或零,因为它们的对数不是有限值。

scaled p equals natural logarithm of p

标准分数 (Standard Score)

使用标准分数 (Wikipedia)缩放所有属性值。

scaled p equals p minus average of p divided by standard deviation of p

当使用此缩放器时,平均值和标准差将作为统计信息进行报告。

中心化 (Center)

通过减去均值来转换所有属性。

p minus average value of p

当使用此缩放器时,平均值将作为统计信息进行报告。

某些缩放器在计算过程中需要进行除法运算。例如,计算“标准分数”需要除以标准差。如果计算缩放属性时需要除以非法值(如 0 或 NaN),则结果缩放属性值将为 0。

语法

CALL gds.scaleProperties.mutate(
  graphName: String,
  configuration: Map
) YIELD
  scalerStatistics: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  postProcessingMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 1. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 2. 配置
名称 类型 默认 可选 描述

mutateProperty

字符串

不适用

写入缩放属性的 GDS 图中的节点属性名称。

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。

concurrency

整数

4

用于运行算法的并发线程数。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

nodeProperties

字符串列表

不适用

待缩放的节点属性名称。所有属性名称必须存在于投影图中。

scaler

字符串或映射

不适用

应用于属性的缩放器名称。支持的值包括 MinMaxMaxMeanLogCenterStdScore(不区分大小写)。要应用特定于缩放器的配置,请使用 Map 语法:{scaler: 'name', …​}

表 3. 结果
名称 类型 描述

scalerStatistics

Map

由指定缩放器计算出的统计信息(如有)。

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

向投影图添加属性的毫秒数。

postProcessingMillis

整数

未使用。

nodePropertiesWritten

整数

已写入的节点属性数量。

配置

Map

运行算法所使用的配置。

特定于缩放器的配置选项

对数缩放器支持特定的配置,我们在此记录。

表 4. log 缩放器的特定配置
名称 类型 默认 可选 描述

type

字符串

不适用

应用于属性的缩放器类型。支持的值包括 MinMaxMaxMeanLogCenterStdScore(不区分大小写)。

offset

Number

0

在计算属性值的对数之前应用的常数加性项。

所有其他缩放器不支持额外的自定义配置。

示例

以下所有示例应在空数据库中运行。

本示例将 Cypher 投影作为标准。原生投影将在未来的版本中弃用。

为了演示 GDS 在缩放节点属性方面的能力,我们将创建一个小型图。

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图:
CREATE
  (:Hotel {avgReview: 4.2, buildYear: 1978, storyCapacity: [32, 32, 0], name: 'East'}),
  (:Hotel {avgReview: 8.1, buildYear: 1958, storyCapacity: [18, 20, 0], name: 'Plaza'}),
  (:Hotel {avgReview: 19.0, buildYear: 1999, storyCapacity: [100, 100, 70], name: 'Central'}),
  (:Hotel {avgReview: -4.12, buildYear: 2005, storyCapacity: [250, 250, 250], name: 'West'}),
  (:Hotel {avgReview: 0.01, buildYear: 2020, storyCapacity: [1250, 1250, 900], name: 'Polar'}),
  (:Hotel {avgReview: 3.3, buildYear: 1981, storyCapacity: [240, 240, 0], name: 'Beach'}),
  (:Hotel {avgReview: 6.7, buildYear: 1984, storyCapacity: [80, 0, 0], name: 'Mountain'}),
  (:Hotel {avgReview: -1.2, buildYear: 2010, storyCapacity: [55, 20, 0], name: 'Forest'})

在 Neo4j 中建立图之后,我们现在可以将其投影到图目录中。我们使用 Cypher 投影针对 Hotel 节点进行操作,包括它们的属性。注意,缩放节点属性不需要任何关系。

以下语句将使用 Cypher 投影来投影一个图,并将其以“myGraph”的名称存储在图目录中。
MATCH (hotel:Hotel)
RETURN gds.graph.project(
  'myGraph',
  hotel,
  null,
  {
    sourceNodeProperties: hotel { .avgReview, .buildYear, .storyCapacity },
    targetNodeProperties: {}
  }
)

在以下示例中,我们将演示如何缩放此图的节点属性。

标量属性

在此示例中,我们将使用均值缩放器缩放 buildYearavgReview 这两个酒店属性。输出是一个我们将其命名为 hotelFeatures 的列表属性。

CALL gds.scaleProperties.mutate('myGraph', {
  nodeProperties: ['buildYear', 'avgReview'],
  scaler: 'Mean',
  mutateProperty: 'hotelFeatures'
}) YIELD nodePropertiesWritten, scalerStatistics
表 5. 结果
nodePropertiesWritten scalerStatistics

8

{avgReview={avg=[4.49875], max=[19.0], min=[-4.12]}, buildYear={avg=[1991.875], max=[2020.0], min=[1958.0]}}

结果显示内存图内现在有八个新的节点属性。它们包含了输入属性的缩放值,其中缩放后的 buildYear 值位于列表的第一位,缩放后的 avgReview 值位于第二位。

列表属性

storyCapacity 属性模拟酒店每一层的房间数量。该属性已标准化,因此楼层较少的酒店值为零。这是因为缩放属性算法要求同一属性的所有值具有相同的长度。在此示例中,我们将展示如何使用缩放属性算法缩放这些列表中的值。我们设想将输出用作输入机器学习算法的特征向量。此外,我们将在特征向量中包含 avgReview 属性。

CALL gds.scaleProperties.mutate('myGraph', {
  nodeProperties: ['avgReview', 'storyCapacity'],
  scaler: 'StdScore',
  mutateProperty: 'features'
})
YIELD mutateMillis
CALL gds.graph.nodeProperty.stream('myGraph', 'features')
YIELD nodeId, propertyValue
RETURN gds.util.asNode(nodeId).name AS name, propertyValue AS features
  ORDER BY name ASC
表 6. 结果
名称 (name) features

"Beach"

[-0.17956547594003253, -0.03401933556831381, 0.00254261210704973, -0.5187592498702616]

"Central"

[2.172199255871029, -0.3968922482969945, -0.3534230828799124, -0.2806402499298136]

"East"

[-0.0447509371737933, -0.5731448059080679, -0.526320706159294, -0.5187592498702616]

"Forest"

[-0.8536381697712284, -0.513529970245499, -0.5568320514438908, -0.5187592498702616]

"Mountain"

[0.32973389273242665, -0.4487312358296632, -0.6076842935848854, -0.5187592498702616]

"Plaza"

[0.5394453974799097, -0.609432097180936, -0.5568320514438908, -0.5187592498702616]

"Polar"

[-0.672387512096618, 2.583849534831454, 2.5705808402272767, 2.542770749364069]

"West"

[-1.2910364511016934, -0.00809984180197948, 0.027968733177547028, 0.3316657499170525]

生成的特征向量在列表的第一个位置包含了 avgReview 属性的标准分数缩放值。我们可以看到一些值是负数,并且 Central 酒店的最大值非常突出。

另外三个列表位置是 storyCapacity 列表属性的缩放值。注意,每个列表项仅相对于其他列表中对应的项进行缩放。因此,Polar 酒店在所有列表位置中都具有最大的缩放值。

使用带偏移量的 Log 进行缩放

log 缩放器支持可配置的偏移量参数。在此示例中,我们将说明如何配置该偏移量。

我们想缩放 avgReview 属性,但它包含负数,对数在负数上未定义。首先,我们将使用 Cypher 的 min() 聚合函数确定最小值:

CALL gds.graph.nodeProperty.stream('myGraph', 'avgReview') YIELD propertyValue
RETURN min(propertyValue) AS minimumAvgReview
表 7. 结果
minimumAvgReview

-4.12

了解此值后,我们可以使用一个更大的值,从而确保对数是一个有限值。我们将使用 5.12,因为这会使最小的缩放值为零。

以下代码将使用 log 缩放器的自定义偏移量运行算法:
CALL gds.scaleProperties.mutate('myGraph', {
  nodeProperties: ['avgReview'],
  scaler: {type: 'Log', offset: 5.12},
  mutateProperty: 'features_log'
})
YIELD mutateMillis
CALL gds.graph.nodeProperty.stream('myGraph', 'features_log')
YIELD nodeId, propertyValue
RETURN gds.util.asNode(nodeId).name AS name, propertyValue AS scaledProperty
  ORDER BY name ASC
表 8. 结果
名称 (name) scaledProperty

"Beach"

[2.130609828254235]

"Central"

[3.183041371858985]

"East"

[2.2321626286975]

"Forest"

[1.366091653802371]

"Mountain"

[2.469793011977952]

"Plaza"

[2.581730834423540]

"Polar"

[1.635105659182678]

"West"

[0.0]

正如我们所见,所有缩放值都是有限数。特别是,最小的缩放值为零。如果您对结果感到好奇,请尝试使用低于 4.12 的偏移量来运行此示例。