在dbscan中查找差异值小于0.1的集群

时间:2019-04-30 10:33:12

标签: python machine-learning cluster-analysis distance dbscan

嗨,我需要对值小于或等于0.1的点进行聚类。我的用例是这样的。

0     1649.500000
1        0.864556
2        0.944651
3        0.922754
4        0.829045
5        0.838665
6        1.323263
7        1.397340
8        1.560655
..       .......
27       1.315072
28       1.593657
29       1.222322
...      .......
...      .......
2890     0.151328
2891     0.149963
2892     0.149285
2893     0.146318
2894     0.147668
2895     0.141159

在这里,我需要将以下几点归类。我在dbscan中给出了如下数据

X = X.reshape(-1,1)
db = DBSCAN(eps=0.1,min_samples=3,metric='manhattan',n_jobs=-1).fit(X)
labels = db.labels_

现在,当我打印与以下各点相对应的点时

for i in range(n_clusters_):
        print("Cluster {0} include {1}".format(i,list(np.where(labels==i))))

我的输出如下:

Cluster 0 include [array([   1,    2,    3, ..., 2893, 2894, 2895])]

如果您可以看到上面提供的数据,则我提供的第一个位置为0.8 ...,第二个位置为0.141 ...但是当我给定eps = 0.1和metric =“ manhattan”时,如何将它们聚类需要绝对的差异)。我在这里想念的是什么,我应该使用其他距离吗?我对eps的理解是否正确?我应该怎么做才能使其按需聚类。

2 个答案:

答案 0 :(得分:1)

这正是DBSCAN的工作方式。

DBSCAN是基于密度的聚类算法。简而言之,它从一个随机点p开始,如果min_points周围epsilon范围内有p个点,那么它将成为核心点。如果两个核心点在epsilon范围内,则将它们放在同一群集中。

这意味着:彼此之间相距较远的两个点(例如,比epsilon大)可以通过它们之间的其他核心点连接,从而属于同一簇

您选择的epsilon和min_points参数似乎导致一个大群集(点0除外)

答案 1 :(得分:0)

DBSCAN epsilon不是最大簇半径,而是 step 大小。群集是通过许多此类步骤构建的,因此距离可能更大。

您正在寻找的可能是Leader群集。一种较旧且较简单的算法,但并未得到广泛使用-群集的目的是了解数据的结构,而不是强加预定义的结构。

由于您的数据是一维的,所以为什么不对数据进行排序,然后确定所需的阈值。或只需使用简单的x < 0.1蒙版(numpy内置功能)将您想要的任何阈值切入即可,例如0、0.1、0.2、0.3。