【问题标题】:Varying cluster labels in DBSCANDBSCAN 中的不同集群标签
【发布时间】:2017-05-20 03:33:13
【问题描述】:

我在 python 中使用来自 sklearn 的 DBSCAN 来聚类一些数据点。我正在使用预先计算的距离矩阵对点进行聚类。

import sklearn.cluster as cl
C = cl.DBSCAN(eps = 2, metric = 'precomputed', min_samples =2)
db =  C.fit(Dist_Matrix)

Dist_Matrix 是我正在使用的预先计算的距离矩阵。每次运行代码时,我都会为数据点获得不同的集群标签。集群的数量也在变化 就像,在第一次运行中,标签是

[ 2  3  3  0  3  0  2  2  2  4  2 -1  0  0  0  1  4  0  1  0  1  3  0  3  0
0  1 -1  0  3  1  3  0  0  2  0  2  0 -1  0  0  3  0  0  0  1  0  1  0  0]

在另一个运行中,它就像

[ 0  2  2  1  2  1  0  0  0  3  0 -1  1  1  1  0  3  1  0  1  0  2  1  2  1
1  0 -1  1  2  0  2  1  1  0  1  0  1 -1  1  1  2  1  1  1  0  1  0  1  1]

我该如何解决这个问题?请帮忙

【问题讨论】:

  • min_samples=2 太小。你在做单链接,而不是 DBSCAN!

标签: python dbscan


【解决方案1】:

聚类通常不会分配相同的标签。

因为标签本身是没有意义的。唯一有价值的信息是对象组合在一起

对于 sklearn,如果您使用旧版本,它会(不必要地)随机打乱数据。因此,随机排列标签也就不足为奇了。

通常,如果您需要稳定的标签,那您就做错了!

但是,如果您真的知道自己需要这样做,请实现一个简单的逻辑:按最小对象对集群进行排序,并相应地重新标记它们。 IE。第一个对象簇是簇 0。第二个对象簇(除非它相同)是簇 1,依此类推。

【讨论】:

    【解决方案2】:

    您可以使用自定义函数来规范化集群标签。

    def normalize_cluster_labels(labels):
         min_value = min(labels)
         if (min_value < 0):
             labels = labels + abs(min(labels)) # normalize indexes
             #idx = clustering.labels_ - min(clustering.labels_ )
     
         return labels
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 2013-01-15
      • 2020-09-09
      • 2018-09-01
      • 2018-11-22
      • 2015-08-15
      • 2021-07-07
      • 2019-10-01
      • 2020-03-04
      相关资源
      最近更新 更多