机器学习 - HDBSCAN聚类



HDBSCAN聚类的运作方式

HDBSCAN使用互达性图构建层次聚类,这是一个图,其中每个数据点都是一个节点,它们之间的边根据相似性或距离的度量进行加权。如果两个点的互达距离低于给定的阈值,则通过连接这两个点来构建该图。

两个点之间的互达距离是它们的达距离的最大值,这是衡量一个点从另一个点到达的难易程度的指标。两个点之间的达距离定义为它们的距离和沿其路径的任何点的最小密度的最大值。

然后使用最小生成树 (MST) 算法从互达性图中提取层次聚类。MST 的叶节点对应于单个数据点,而内部节点对应于不同大小和形状的聚类。

然后,HDBSCAN算法将压缩树算法应用于MST以提取聚类。压缩树是MST的紧凑表示,仅包含树的内部节点。然后在特定级别切割压缩树以获得聚类,切割的级别由用户定义的最小聚类大小或基于聚类稳定性的启发式方法确定。

Python实现

HDBSCAN作为一个Python库可用,可以使用pip安装。该库提供HDBSCAN算法的实现以及一些用于数据预处理和可视化的有用函数。

安装

要安装HDBSCAN,请打开终端窗口并键入以下命令:

pip install hdbscan

用法

要使用HDBSCAN,首先导入hdbscan库:

import hdbscan

接下来,我们使用scikit-learn中的make_blobs()函数生成一个样本数据集:

# generate random dataset with 1000 samples and 3 clusters
X, y = make_blobs(n_samples=1000, centers=3, random_state=42)

现在,创建一个HDBSCAN类的实例并将其拟合到数据:

clusterer = hdbscan.HDBSCAN(min_cluster_size=10, metric='euclidean')

# fit the data to the clusterer
clusterer.fit(X)

这将把HDBSCAN应用于数据集并将每个点分配到一个聚类。为了可视化聚类结果,您可以绘制数据,并根据其聚类标签对每个点进行着色:

# get the cluster labels
labels = clusterer.labels_

# create a colormap for the clusters
colors = np.array([x for x in 'bgrcmykbgrcmykbgrcmykbgrcmyk'])
colors = np.hstack([colors] * 20)

# plot the data with each point colored according to its cluster label
plt.figure(figsize=(7.5, 3.5))
plt.scatter(X[:, 0], X[:, 1], c=colors[labels])
plt.show()

此代码将生成数据的散点图,每个点根据其聚类标签着色如下:

hdbscan

HDBSCAN还提供了一些可以调整的参数来微调聚类结果:

  • min_cluster_size - 聚类的最小大小。不属于任何聚类的点标记为噪声。

  • min_samples - 被认为是核心点的点邻域中的最小样本数。

  • cluster_selection_epsilon - 用于聚类选择的邻域半径。

  • metric - 用于衡量点之间相似性的距离度量。

HDBSCAN聚类的优势

HDBSCAN比其他聚类算法具有几个优势:

  • 更好地处理不同密度的聚类 - HDBSCAN可以识别不同密度的聚类,这是许多数据集中常见的问题。

  • 能够检测不同形状和大小的聚类 - HDBSCAN可以识别不一定是球形的聚类,这是许多数据集中另一个常见的问题。

  • 无需指定聚类数量 - HDBSCAN不需要用户指定聚类数量,这在先验很难确定。

  • 对噪声具有鲁棒性 - HDBSCAN对噪声数据具有鲁棒性,可以将异常值识别为噪声点。

广告