【问题标题】:Explain Behavior of HDBSCAN Clustering解释 HDBSCAN 聚类的行为
【发布时间】:2021-09-13 22:50:03
【问题描述】:

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

仅通过查看此矩阵,我可以看出元素 #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: {元素 #0,元素 #2}

集群 1: {元素 #4,元素 #5}

异常值: {元素 #1,元素 #3}

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

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

集群形成:

簇 0: {元素#0,元素#2,元素#4,元素#5}

集群 1: {元素 #1,元素 #3}

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

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

以下是两个聚类试验的直观表示:

【问题讨论】:

    标签: python scikit-learn cluster-analysis hierarchical-clustering hdbscan


    【解决方案1】:

    正如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)
    

    结果将是:

    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.AgglomerativeClustering 中的一些东西,因为您不依赖 hdbscan 来计算距离指标。

    【讨论】:

    • 谢谢您的帮助,但既然您提到“您没有那么多数据点” - 我需要多少数据点才能使 HDBSCAN 运行良好?如上例所示,我们是在谈论 3 个变量/维度的数百或数千个数据点吗?您还提到,如果我有一个预先计算的距离矩阵,您认为凝聚聚类会表现得更好,这是为什么呢?
    • pberba.github.io/stats/2020/01/17/hdbscan 顾名思义,你需要某种密度估计来开始获取集群和异常值。6 点可能不够
    • 在这个例子中你有,我的意思是得到你需要的聚类,你可以尝试使用聚合聚类中的平均或完整算法,你会看到它有效
    猜你喜欢
    • 2017-10-10
    • 2017-12-09
    • 1970-01-01
    • 2016-12-09
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 2014-08-13
    相关资源
    最近更新 更多