属性缩放

简介

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

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

如果节点缺少某个属性的值,该节点将从该属性的缩放中省略。它将接收 `NaN` 的输出值。这包括列表属性。

属性缩放算法支持多种缩放器。这些可以通过 `scaler` 配置参数进行配置。

列表属性是逐索引缩放的。有关更多详细信息,请参阅列表示例

在以下方程式中,`p` 表示包含图中所有节点单个属性的所有属性值的向量。

最小-最大缩放器

根据以下公式,将所有属性值缩放到 `[0, 1]` 范围,其中最小值获得缩放值 `0`,最大值获得缩放值 `1`

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

使用此缩放器时,最小和最大值将作为统计数据报告。

最大值缩放器

根据以下公式,将所有属性值缩放到 `[-1, 1]` 范围,其中最大绝对值获得缩放值 `1`

scaled p equals p divided by the maximum of absolute p

使用此缩放器时,最大绝对值将作为统计数据报告。

平均值缩放器

将所有属性值缩放到 `[-1, 1]` 范围,其中平均值获得缩放值 `0`。

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

使用此缩放器时,最小、最大和平均值将作为统计数据报告。

对数缩放器

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

scaled p equals natural logarithm of p

标准分数

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

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

使用此缩放器时,平均值和标准差将作为统计数据报告。

中心化

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

p minus average value of p

使用此缩放器时,平均值将作为统计数据报告。

一些缩放器必须进行除法运算作为其计算的一部分。例如,计算“标准分数”需要除以标准差。如果计算缩放属性需要除以非法值,如 0 或 NaN,则生成的缩放属性值将为 0。

语法

本节介绍在每种执行模式下执行属性缩放算法所使用的语法。我们正在描述具名图的语法变体。要了解有关通用语法变体的更多信息,请参阅语法概述

每种模式下的属性缩放语法
在具名图上以流模式运行属性缩放。
CALL gds.scaleProperties.stream(
  graphName: String,
  configuration: Map
) YIELD
  nodeId: Integer,
  scaledProperty: List of Float
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

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

配置

映射

{}

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

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

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤具名图。将包含具有任何给定标签的节点。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤具名图。将包含具有任何给定类型的关系。

并发

整数

4 [1]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

nodeProperties

字符串列表

不适用

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

缩放器

字符串或映射

不适用

应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …​}`。

1. 在GDS 会话中,默认值为可用处理器数量

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

scaledProperty

浮点数列表

每个输入节点属性的缩放值。

在具名图上以修改模式运行属性缩放。
CALL gds.scaleProperties.mutate(
  graphName: String,
  configuration: Map
) YIELD
  scalerStatistics: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  postProcessingMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 4. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

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

配置

映射

{}

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

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

mutateProperty

字符串

不适用

缩放属性将被写入的 GDS 图中的节点属性。

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

并发

整数

4

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

jobId

字符串

内部生成

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

nodeProperties

字符串列表

不适用

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

缩放器

字符串或映射

不适用

应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …​}`。

表 6. 结果
名称 类型 描述

scalerStatistics

映射

由指定缩放器计算的统计数据(如果有)。

preProcessingMillis

整数

数据预处理的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

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

postProcessingMillis

整数

未使用。

nodePropertiesWritten

整数

写入的节点属性数量。

配置

映射

运行算法所使用的配置。

在具名图上以统计模式运行属性缩放。
CALL gds.scaleProperties.stats(
  graphName: String,
  configuration: Map
)
YIELD
  scalerStatistics: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

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

配置

映射

{}

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

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

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤具名图。将包含具有任何给定标签的节点。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤具名图。将包含具有任何给定类型的关系。

并发

整数

4 [2]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

nodeProperties

字符串列表

不适用

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

缩放器

字符串或映射

不适用

应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …​}`。

2. 在GDS 会话中,默认值为可用处理器数量

表 9. 结果
名称 类型 描述

scalerStatistics

映射

由指定缩放器计算的统计数据(如果有)。

preProcessingMillis

整数

数据预处理的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

未使用。

配置

映射

运行算法所使用的配置。

在具名图上以写入模式运行属性缩放。
CALL gds.scaleProperties.write(
  graphName: String,
  configuration: Map
)
YIELD
  scalerStatistics: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  postProcessingMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 10. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

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

配置

映射

{}

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

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

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤具名图。将包含具有任何给定标签的节点。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤具名图。将包含具有任何给定类型的关系。

并发

整数

4 [3]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

writeConcurrency

整数

'concurrency' 的值

用于将结果写入 Neo4j 的并发线程数。

writeProperty

字符串

不适用

缩放属性将被写入的 Neo4j 数据库中的节点属性。

nodeProperties

字符串列表

不适用

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

缩放器

字符串或映射

不适用

应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …​}`。

3. 在GDS 会话中,默认值为可用处理器数量

表 12. 结果
名称 类型 描述

scalerStatistics

映射

由指定缩放器计算的统计数据(如果有)。

preProcessingMillis

整数

数据预处理的毫秒数。

computeMillis

整数

运行算法的毫秒数。

writeMillis

整数

将结果写回 Neo4j 的毫秒数。

postProcessingMillis

整数

未使用。

nodePropertiesWritten

整数

写入的节点属性数量。

配置

映射

运行算法所使用的配置。

缩放器特定配置选项

对数缩放器支持特定配置,我们在此处进行说明。

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

类型

字符串

不适用

应用于属性的缩放器类型。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。

偏移量

数字

0

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

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

示例

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

示例通常使用Cypher 投影。原生投影将在未来版本中弃用。

本节将展示在具体图上运行属性缩放算法的示例。目的是说明结果如何,并提供在实际环境中如何使用该算法的指南。我们将在一个小型酒店图上进行演示,该图包含少量节点,以特定模式连接。示例图如下所示

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: {}
  }
)

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

内存估算

首先,我们将使用 `estimate` 过程估算运行算法的成本。这可以在任何执行模式下完成。在本例中,我们将使用 `stream` 模式。估算算法有助于了解在图上运行算法对内存的影响。当您稍后实际以某种执行模式运行算法时,系统将执行估算。如果估算显示执行极有可能超出其内存限制,则禁止执行。要了解更多信息,请参阅自动估算和执行阻止

有关 `estimate` 的更多详细信息,请参阅内存估算

以下将估算运行算法的内存要求
CALL gds.scaleProperties.stream.estimate('myGraph', {
  nodeProperties: ['buildYear', 'storyCapacity'],
  scaler: 'MinMax'
})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
表 14. 结果
节点数 关系数 最小字节数 最大字节数 所需内存

8

0

480

480

"480 字节"

流模式

在 `stream` 执行模式下,算法返回每个节点的缩放属性。这使我们能够直接检查结果或在 Cypher 中对其进行后处理,而不会产生任何副作用。请注意,输出始终是单个列表属性,其中包含按输入顺序排列的所有缩放节点属性。

有关 `stream` 模式的更多详细信息,请参阅流模式

以下将以 `stream` 模式运行算法
CALL gds.scaleProperties.stream('myGraph', {
  nodeProperties: ['buildYear', 'avgReview'],
  scaler: 'MinMax'
}) YIELD nodeId, scaledProperty
RETURN gds.util.asNode(nodeId).name AS name, scaledProperty
  ORDER BY name ASC
表 15. 结果
名称 scaledProperty

"Beach"

[0.3709677419354839, 0.3209342560553633]

"Central"

[0.6612903225806451, 1.0]

"East"

[0.3225806451612903, 0.35986159169550175]

"Forest"

[0.8387096774193549, 0.12629757785467127]

"Mountain"

[0.41935483870967744, 0.4679930795847751]

"Plaza"

[0.0, 0.5285467128027681]

"Polar"

[1.0, 0.17863321799307957]

"West"

[0.7580645161290323, 0.0]

在结果中,我们可以观察到 `scaledProperty` 的第一个元素是我们得到的 `buildYear` 的最小-最大缩放值,其中 `Plaza` 酒店具有最小值并缩放到零,而 `Polar` 酒店具有最大值并缩放到一。这可以通过示例图进行验证。`scaledProperty` 结果中的第二个值是 `avgReview` 属性的缩放值。

修改模式

在 `mutate` 执行模式下,您可以更新具名图,为其中的节点添加一个包含缩放属性的新节点属性。新属性的名称通过强制配置参数 `mutateProperty` 指定。结果是包含计算指标的单个摘要行。`mutate` 模式在多个算法结合使用时特别有用。

有关 `mutate` 模式的更多详细信息,请参阅修改模式

在本例中,我们将使用平均值缩放器缩放 `buildYear` 和 `avgReview` 这两个酒店属性。输出是一个列表属性,我们将其命名为 `hotelFeatures`,设想稍后将其用作机器学习模型的输入。

以下将以 `mutate` 模式运行算法
CALL gds.scaleProperties.mutate('myGraph', {
  nodeProperties: ['buildYear', 'avgReview'],
  scaler: 'Mean',
  mutateProperty: 'hotelFeatures'
}) YIELD nodePropertiesWritten, scalerStatistics
表 16. 结果
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` 值位于第二个位置。要了解如何检查内存中图的新模式,请参阅列出目录中的图

统计模式

在 `stats` 执行模式下,算法返回包含算法结果摘要的单行数据。此执行模式没有任何副作用。通过检查 `computeMillis` 返回项,它可用于评估算法性能。在下面的示例中,我们将省略返回计时。该过程的完整签名可在语法部分中找到。

有关 `stats` 模式的更多详细信息,请参阅统计模式

以下将以 `stats` 模式使用“中心化”缩放器运行算法
CALL gds.scaleProperties.stats('myGraph', {
  nodeProperties: ['buildYear', 'avgReview'],
  scaler: 'center'
}) YIELD scalerStatistics
表 17. 结果
scalerStatistics

{avgReview={avg=[4.49875]}, buildYear={avg=[1991.875]}}

不同的缩放器在计算过程中需要计算不同的统计数据。这将在返回的 `scalerStatistics` 中体现。由于“中心化”计算各种输入属性的平均值,因此在这种情况下,我们获得的就是缩放器统计结果。

写入模式

`write` 执行模式在 `stats` 模式的基础上增加了一个重要的副作用:将每个节点的缩放属性作为属性写入 Neo4j 数据库。新属性的名称通过强制配置参数 `writeProperty` 指定。结果是类似于 `stats` 的单个摘要行,但包含一些额外的指标。`write` 模式可以直接将结果持久化到数据库。

有关 `write` 模式的更多详细信息,请参阅写入模式

以下将以 `write` 模式运行算法
CALL gds.scaleProperties.write('myGraph', {
  nodeProperties: ['buildYear', 'avgReview'],
  scaler: 'stdscore',
  writeProperty: 'hotelStdScore'
}) YIELD nodePropertiesWritten, scalerStatistics
表 18. 结果
nodePropertiesWritten scalerStatistics

8

{avgReview={avg=[4.49875], std=[6.6758378454]}, buildYear={avg=[1991.875], std=[18.9171714323]}}

结果显示,数据库图中的节点现在有八个新的节点属性,它们对应于投影 `'myGraph'` 中的节点。这些节点属性包含输入属性的缩放值,其中缩放后的 `buildYear` 值位于列表的第一个位置,缩放后的 `avgReview` 值位于第二个位置。

列表属性

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

以下将以 `mutate` 模式运行算法
CALL gds.scaleProperties.stream('myGraph', {
  nodeProperties: ['avgReview', 'storyCapacity'],
  scaler: 'StdScore'
}) YIELD nodeId, scaledProperty
RETURN gds.util.asNode(nodeId).name AS name, scaledProperty AS features
  ORDER BY name ASC
表 19. 结果
名称 特征

"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` 缩放器支持可配置的偏移量参数。在本示例中,我们将说明如何配置该偏移量。

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

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

-4.12

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

以下将使用自定义对数缩放器偏移量运行算法
CALL gds.scaleProperties.stream('myGraph', {
  nodeProperties: ['avgReview'],
  scaler: {type: 'Log', offset: 5.12}
}) YIELD nodeId, scaledProperty
RETURN gds.util.asNode(nodeId).name AS name, scaledProperty
  ORDER BY name ASC
表 21. 结果
名称 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` 的偏移量运行此示例。

© . All rights reserved.