缩放节点属性
简介
缩放属性可用于预处理节点属性以进行模型训练,或对 PageRank 分数等算法结果进行后处理。它根据指定的缩放器对节点属性进行缩放。可以同时缩放多个属性,并以列表属性的形式返回。
输入属性必须是数字或数字列表。所有列表必须具有相同的大小。输出属性始终是一个列表。输出列表的大小等于输入属性长度之和。也就是说,如果输入属性是两个标量数值属性和一个长度为 3 的列表属性,则输出列表的总长度为 5。
如果节点的某个属性缺少值,则该节点将被排除在该属性的缩放之外。它将获得 NaN 的输出值。这同样适用于列表属性。
支持多种用于缩放属性的缩放器。这些缩放器可以使用 scaler 配置参数进行配置。
列表属性按索引逐项进行缩放。详情请参阅列表示例。
在以下公式中,p 表示包含图中所有节点的所有属性值的向量。
语法
CALL gds.scaleProperties.mutate(
graphName: String,
configuration: Map
) YIELD
scalerStatistics: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
postProcessingMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
mutateProperty |
字符串 |
|
否 |
写入缩放属性的 GDS 图中的节点属性名称。 |
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
nodeProperties |
字符串列表 |
|
否 |
待缩放的节点属性名称。所有属性名称必须存在于投影图中。 |
scaler |
字符串或映射 |
|
否 |
应用于属性的缩放器名称。支持的值包括 |
| 名称 | 类型 | 描述 |
|---|---|---|
scalerStatistics |
Map |
由指定缩放器计算出的统计信息(如有)。 |
preProcessingMillis |
整数 |
预处理数据的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
mutateMillis |
整数 |
向投影图添加属性的毫秒数。 |
postProcessingMillis |
整数 |
未使用。 |
nodePropertiesWritten |
整数 |
已写入的节点属性数量。 |
配置 |
Map |
运行算法所使用的配置。 |
示例
|
以下所有示例应在空数据库中运行。 本示例将 Cypher 投影作为标准。原生投影将在未来的版本中弃用。 |
为了演示 GDS 在缩放节点属性方面的能力,我们将创建一个小型图。
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 节点进行操作,包括它们的属性。注意,缩放节点属性不需要任何关系。
MATCH (hotel:Hotel)
RETURN gds.graph.project(
'myGraph',
hotel,
null,
{
sourceNodeProperties: hotel { .avgReview, .buildYear, .storyCapacity },
targetNodeProperties: {}
}
)
在以下示例中,我们将演示如何缩放此图的节点属性。
标量属性
在此示例中,我们将使用均值缩放器缩放 buildYear 和 avgReview 这两个酒店属性。输出是一个我们将其命名为 hotelFeatures 的列表属性。
CALL gds.scaleProperties.mutate('myGraph', {
nodeProperties: ['buildYear', 'avgReview'],
scaler: 'Mean',
mutateProperty: 'hotelFeatures'
}) YIELD nodePropertiesWritten, scalerStatistics
| 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
| 名称 (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
| minimumAvgReview |
|---|
-4.12 |
了解此值后,我们可以使用一个更大的值,从而确保对数是一个有限值。我们将使用 5.12,因为这会使最小的缩放值为零。
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
| 名称 (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 的偏移量来运行此示例。