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

Finding clusters with difference in value <0.1 in dbscan

您好,我需要对值小于或等于 0 的点进行聚类。1.My 用例是这样的。

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])]

如果你能看到我提供的上述数据,第 1 个位置有 0.8 ...,第 2895 个位置有 0.141 ...但是当我给出 eps =0.1 和 metric=[=24 时,它们如何聚类=](取绝对差值)。我在这里缺少什么,我应该使用其他一些 distance.Is 我对 eps 的理解错误吗?我应该怎么做才能按照我的意愿将其聚类。

这正是 DBSCAN 的工作方式。

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

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

您选择的 epsilon 和 min_points 参数似乎会产生一个大簇(点 0 除外)

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

你要找的可能是Leader集群。一种较旧且更简单的算法,但并未特别广泛使用 - 聚类的目的是了解数据的结构,而不是强加预定义的结构。

由于您的数据是一维的,为什么不直接对数据进行排序,然后确定您喜欢的阈值。或者只是在你想要的任何阈值处进行切割,例如在 0、0.1、0.2、0.3 处使用简单的 x < 0.1 掩码,一个 numpy 内置功能。