HDBSCAN

词汇表

有向

有向特性。算法在有向图上定义良好。

有向

有向特性。算法忽略图的方向。

有向

有向特性。算法不在有向图上运行。

无向

无向特性。算法在无向图上定义良好。

无向

无向特性。算法忽略图的无向性。

异构节点

异构节点完全支持。算法能够区分不同类型的节点。

异构节点

异构节点允许。算法无论标签如何,都将所有选定节点视为相似。

异构关系

异构关系完全支持。算法能够区分不同类型的关系。

异构关系

异构关系允许。算法无论类型如何,都将所有选定关系视为相似。

加权关系

加权特性。算法支持使用关系属性作为权重,通过 relationshipWeightProperty 配置参数指定。

加权关系

加权特性。算法将每个关系视为同等重要,忽略任何关系权重的值。

简介

HDBSCAN,全称 Hierarchical Density-Based Spatial Clustering of Applications with Noise(带噪声的基于密度的分层空间聚类),是一种用于识别数据集中相似数据点簇的聚类算法。它建立在 DBSCAN 算法的基础上,但增加了分层结构,使其对数据中不同的密度更加稳健。

与 DBSCAN 不同,HDBSCAN 不需要调整特定的密度参数;相反,它在一系列参数上运行 DBSCAN,创建簇的层次结构。这种分层方法使得 HDBSCAN 能够找到不同密度的簇,并能更好地适应真实世界的数据。

HDBSCAN 以其易用性、噪声容忍度和处理不同密度数据的能力而闻名,使其成为聚类任务的多功能工具,尤其是在处理复杂、高维数据集时。

有关此算法的更多信息,请参阅

注意事项

为了使 HDBSCAN 正常工作,所有节点的属性数组必须具有相同数量的元素。此外,它们应仅包含数字,并且不包含任何 NaN 值。

语法

HDBSCAN 各模式语法
在流模式下在命名图上运行 HDBSCAN。
CALL gds.hdbscan.stream(
  graphName: String,
  configuration: Map
)
YIELD
  nodeId: Integer,
  label: Integer
表 1. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [1]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

nodeProperty

字符串

不适用

对应于 HDBSCAN 用于计算簇的浮点数组的节点属性。

minClusterSize

整数

5

簇应包含的最小节点数。

samples

整数

10

计算节点核心距离时要考虑的邻居数量。

leafSize

整数

1

支持树数据结构的叶节点数。

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

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

label

整数

标签 ID,如果节点被认为是 noise,则为 -1

在统计模式下在命名图上运行 HDBSCAN。
CALL gds.hdbscan.stats(
  graphName: String,
  configuration: Map
)
YIELD
  nodeCount: Integer,
  numberOfClusters: Integer,
  numberOfNoisePoints: Integer,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  configuration: Map
表 4. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [2]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

nodeProperty

字符串

不适用

对应于 HDBSCAN 用于计算簇的浮点数组的节点属性。

minClusterSize

整数

5

簇应包含的最小节点数。

samples

整数

10

计算节点核心距离时要考虑的邻居数量。

leafSize

整数

1

支持树数据结构的叶节点数。

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

表 6. 结果
名称 类型 描述

nodeCount

整数

算法运行的节点数。

numberOfClusters

整数

算法找到的簇数。

numberOfNoisePoints

整数

算法找到的噪声点数。

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

postProcessingMillis

整数

计算百分位数和社区计数所用的毫秒数。

configuration

映射

用于运行算法的配置。

在修改模式下在命名图上运行 HDBSCAN。
CALL gds.hdbscan.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  nodeCount: Integer,
  numberOfClusters: Integer,
  numberOfNoisePoints: Integer,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  mutateMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 7. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

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

configuration

映射

{}

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

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

mutateProperty

字符串

不适用

要写入簇的 GDS 图中的节点属性。

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

nodeProperty

字符串

不适用

对应于 HDBSCAN 用于计算簇的浮点数组的节点属性。

minClusterSize

整数

5

簇应包含的最小节点数。

samples

整数

10

计算节点核心距离时要考虑的邻居数量。

leafSize

整数

1

支持树数据结构的叶节点数。

表 9. 结果
名称 类型 描述

nodeCount

整数

算法运行的节点数。

numberOfClusters

整数

算法找到的簇数。

numberOfNoisePoints

整数

算法找到的噪声点数。

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

mutateMillis

整数

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

postProcessingMillis

整数

计算百分位数和社区计数所用的毫秒数。

nodePropertiesWritten

整数

添加到投影图的属性数量。

configuration

映射

用于运行算法的配置。

在写入模式下在命名图上运行 HDBSCAN。
CALL gds.hdbscan.write(
  graphName: String,
  configuration: Map
)
YIELD
  nodeCount: Integer,
  numberOfClusters: Integer,
  numberOfNoisePoints: Integer,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  writeMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 10. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [3]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

writeConcurrency

整数

'concurrency' 的值

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

writeProperty

字符串

不适用

要写入簇的 Neo4j 数据库中的节点属性。

nodeProperty

字符串

不适用

对应于 HDBSCAN 用于计算簇的浮点数组的节点属性。

minClusterSize

整数

5

簇应包含的最小节点数。

samples

整数

10

计算节点核心距离时要考虑的邻居数量。

leafSize

整数

1

支持树数据结构的叶节点数。

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

表 12. 结果
名称 类型 描述

nodeCount

整数

算法运行的节点数。

numberOfClusters

整数

算法找到的簇数。

numberOfNoisePoints

整数

算法找到的噪声点数。

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

writeMillis

整数

向 Neo4j 数据库添加属性的毫秒数。

postProcessingMillis

整数

计算百分位数和社区计数所用的毫秒数。

nodePropertiesWritten

整数

添加到投影图的属性数量。

configuration

映射

用于运行算法的配置。

示例

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

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

在本节中,我们将展示在具体图上运行 HDBSCAN 算法的示例。目的是说明结果如何以及提供如何在实际环境中利用算法的指南。我们将在一个由少数节点以特定模式连接的小城市图上进行此操作。示例图如下所示

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图
CREATE
  (:City {name: 'Surbiton', coordinates: [51.39148, -0.29825]}),
  (:City {name: 'Liverpool', coordinates: [53.41058, -2.97794]}),
  (:City {name: 'Kingston upon Thames', coordinates: [51.41259, -0.2974]}),
  (:City {name: 'Sliven', coordinates: [42.68583, 26.32917]}),
  (:City {name: 'Solna', coordinates: [59.36004, 18.00086]}),
  (:City {name: 'Örkelljunga', coordinates: [56.28338, 13.27773]}),
  (:City {name: 'Malmö', coordinates: [55.60587, 13.00073]}),
  (:City {name: 'Xánthi', coordinates: [41.13488, 24.888]});

此图由欧洲的三个全球位置(英国、瑞典和巴尔干地区)的各种 City 节点组成。

我们现在可以投影图并将其存储在图目录中。我们加载带有 coordinates 节点属性的 City 节点标签。

以下语句将投影图并将其存储在图目录中。
MATCH (c:City)
RETURN gds.graph.project(
  'cities',
  c,
  null,
  {
    sourceNodeProperties: c { .coordinates },
    targetNodeProperties: {}
  }
)

在以下示例中,我们将演示在此图上使用 HDBSCAN 算法来查找地理位置彼此接近的城市社区。

内存估算

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

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

以下将估算运行算法所需的内存
CALL gds.hdbscan.write.estimate('cities', {
  writeProperty: 'label',
  nodeProperty: 'coordinates'
})
YIELD nodeCount, bytesMin, bytesMax, requiredMemory
表 13. 结果
nodeCount bytesMin bytesMax requiredMemory

8

9920

9920

"9920 字节"

stream 执行模式下,算法返回每个节点的簇。这允许我们直接检查结果或在 Cypher 中对其进行后处理,而不会产生任何副作用。

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

以下将运行算法并流式传输结果
CALL gds.hdbscan.stream('cities', {
  nodeProperty: 'coordinates',
  minClusterSize: 2,
  samples: 2
})
YIELD nodeId, label
RETURN gds.util.asNode(nodeId).name AS name, label
ORDER BY label, name ASC
表 14. 结果
name label

"斯利文"

-1

"克桑西"

-1

"泰晤士河畔金斯顿"

1

"利物浦"

1

"瑟比顿"

1

"马尔默"

2

"索尔纳"

2

"厄克勒永加"

2

在上面的示例中,我们可以看到这些城市地理位置上彼此聚类。

统计

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

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

以下将运行算法并以统计和测量值的形式返回结果
CALL gds.hdbscan.stats('cities', {
  nodeProperty: 'coordinates',
  minClusterSize: 2,
  samples: 2
})
YIELD nodeCount, numberOfClusters, numberOfNoisePoints
表 15. 结果
nodeCount numberOfClusters numberOfNoisePoints

8

2

2

修改

mutate 执行模式通过一个重要的副作用扩展了 stats 模式:用包含该节点簇的新节点属性更新命名图。新属性的名称使用强制配置参数 mutateProperty 指定。结果是一个摘要行,类似于 stats,但包含一些附加指标。当多个算法结合使用时,mutate 模式特别有用。

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

以下将运行算法并将结果存储在 cities 图中
CALL gds.hdbscan.mutate('cities', {
  nodeProperty: 'coordinates',
  minClusterSize: 2,
  samples: 2,
  mutateProperty: 'label'
})
YIELD nodeCount, numberOfClusters, nodePropertiesWritten, numberOfNoisePoints
表 16. 结果
nodeCount numberOfClusters nodePropertiesWritten numberOfNoisePoints

8

2

8

2

mutate 模式下,过程只返回一行。结果写入 GDS 内存图而不是 Neo4j 数据库。

写入

write 执行模式通过一个重要的副作用扩展了 stats 模式:将每个节点的簇作为属性写入 Neo4j 数据库。新属性的名称使用强制配置参数 writeProperty 指定。结果是一个摘要行,类似于 stats,但包含一些附加指标。write 模式能够将结果直接持久化到数据库。

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

以下将运行算法并将结果写回 Neo4j
CALL gds.hdbscan.write('cities', {
  nodeProperty: 'coordinates',
  minClusterSize: 2,
  samples: 2,
  writeProperty: 'label'
})
YIELD nodeCount, numberOfClusters, nodePropertiesWritten, numberOfNoisePoints
表 17. 结果
nodeCount numberOfClusters nodePropertiesWritten numberOfNoisePoints

8

2

8

2

write 模式下,过程只返回一行。结果写入 Neo4j 数据库而不是 GDS 内存图。

© . All rights reserved.