解释HDBSCAN集群的行为

2024-04-25 11:50:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含6个元素的数据集。我使用Gower distance计算了距离矩阵,得出了以下矩阵:

enter image description here

只要看一下这个矩阵,我就可以知道元素#0与元素#4和#5最为相似,所以我假设HDBSCAN的输出是将它们聚集在一起,并假设其余的是异常值;然而,事实并非如此

clusterer = hdbscan.HDBSCAN(min_cluster_size=2, min_samples=3, metric='precomputed',cluster_selection_epsilon=0.1, cluster_selection_method = 'eom').fit(distance_matrix) 

形成的集群:

簇0:{element#0,element#2}

集群1:{element#4,element#5}

异常值:{element#1,element#3}

这是我不理解的行为。另外,参数cluster_selection_epsiloncluster_selection_method似乎对我的结果没有任何影响,我不明白为什么

我尝试再次将参数更改为min_cluster_size=2, min_samples=1

形成的集群:

簇0:{element#0,element#2,element#4,element#5}

集群1:{element#1,element#3}

参数的任何其他变化都会导致将所有点归类为异常值

请有人解释一下这种行为,解释一下为什么cluster_selection_epsiloncluster_selection_method不影响所形成的集群。我认为通过将cluster_selection_epsilon设置为0.1,可以确保簇内的点之间的距离为0.1或更小(例如,元素#0和元素#2不会聚集在一起)

以下是两个聚类试验的视觉表现: enter image description here

enter image description here


Tags: 元素距离参数size集群矩阵elementmin
1条回答
网友
1楼 · 发布于 2024-04-25 11:50:07

help page中所述,hdbscan的核心是1)计算相互可达距离和2)应用单连杆算法。由于您没有那么多的数据点,并且距离度量是预先计算的,因此可以看到您的群集由单个链接决定:

import numpy as np
import hdbscan
import matplotlib.pyplot as plt
import seaborn as sns

x = np.array([[0.0, 0.741, 0.344, 1.0, 0.062, 0.084],
 [0.741, 0.0, 0.648, 0.592, 0.678, 0.657],
 [0.344, 0.648, 0.0, 0.648, 0.282, 0.261],
 [1.0, 0.592, 0.655, 0.0, 0.937, 0.916],
 [0.062, 0.678, 0.282, 0.937, 0.0, 0.107],
 [0.084, 0.65, 0.261, 0.916, 0.107, 0.0]])

clusterer = hdbscan.HDBSCAN(min_cluster_size=2,min_samples=1,
                            metric='precomputed').fit(x)
clusterer.single_linkage_tree_.plot(cmap='viridis', colorbar=True)

enter image description here

结果将是:

clusterer.labels_

[0 1 0 1 0 0]

因为集群的最小数量必须是2。所以实现这一点的唯一方法是将元素0,2,4,5放在一起

一个快速的解决方案是简单地切割树并获得您想要的集群:

clusterer.single_linkage_tree_.get_clusters(0.15, min_cluster_size=2)

[ 0 -1 -1 -1  0  0]

或者您只需使用sklearn.cluster.aggregativeclustering中的内容,因为您不依赖hdbscan来计算距离度量

相关问题 更多 >