在DBSCAN中改变群集标签

时间:2017-01-05 14:33:10

标签: python dbscan

我在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]

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

2 个答案:

答案 0 :(得分:0)

群集通常不会分配相同的标签。

因为标签本身无意义。唯一有价值的信息是什么对象在一起

至于sklearn,如果您使用旧版本,它将(不必要地)随机地随机播放数据。因此,对标签进行随机排列并不奇怪。

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

Butif你真的知道你需要它,实现一个简单的逻辑:按最小的对象对簇进行排序,并相应地重新标记它们。即第一个对象簇是簇0.第二个对象簇(除非它是相同的)是cluater 1,依此类推。

答案 1 :(得分:0)

您可以使用自定义功能来规范集群标签。

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