Machine Learning 简明教程
Machine Learning - HDBSCAN Clustering
Working of HDBSCAN Clustering
HDBSCAN 使用基于可互达图构建聚类的层次,基于可互达图,其中每个数据点都是一个节点,节点之间的边由相似度或距离的测量值加权。通过将两个数据点的可互达距离低于给定阈值而连接两点来构建该图。
两个点之间的可互达距离是其可达距离的最大值,可达距离是对一个点可以多容易地从另一个点抵达的测量。两个点之间的可达距离定义为其距离和其路径上任意点的最小密度的最大值。
然后使用最小生成树 (MST) 算法从基于可互达图中提取聚类的层次。MST 的叶子对应于各个数据点,而内部节点对应于不同大小和形状的聚类。
然后,HDBSCAN 算法向 MST 应用聚合树算法来提取聚类。聚合树是 MST 的一个紧凑表现形式,仅包括树的内部节点。然后在特定级别对聚合树进行剪切以获得聚类,其中剪切级别由用户定义的最小聚类大小或基于聚类稳定性的启发法确定。
Implementation in Python
HDBSCAN 以一个 Python 库的形式提供,可以通过 pip 进行安装。该库提供了 HDBSCAN 算法的实现以及若干用于数据预处理和可视化的实用函数。
Usage
要使用 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 还提供了若干参数,可以用于微调聚类结果:
-
min_cluster_size — 一个簇的最小大小。不属于任何簇的点被标记为噪声。
-
min_samples — 一个点被认为是核心点的邻域中的最小样本数量。
-
cluster_selection_epsilon — 用于簇选择邻域的半径。
-
metric — 用于测量点之间相似度的距离度量。
Advantages of HDBSCAN Clustering
与其他聚类算法相比,HDBSCAN 有几个优点:
-
Better handling of clusters of varying densities — HDBSCAN 可以识别不同密度簇,这是很多数据集中常见的问题。
-
Ability to detect clusters of different shapes and sizes — HDBSCAN 可以识别不一定是球形的簇,这是很多数据集中另一个常见的问题。
-
No need to specify the number of clusters — HDBSCAN 不要求用户指定簇的数量,这可能会让人难以先验确定。
-
Robust to noise — HDBSCAN 对噪声数据具有鲁棒性,并且可以识别异常点作为噪声点。