在dbscan中查找值<0.1的簇

问题描述 投票:2回答:2

嗨我需要聚集值小于或等于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 ......而第2895个位置有0.141 ......但是当我给出eps = 0.1和metric =“manhattan”时它们如何聚类(这取决于绝对差异) )。我在这里缺少什么,我应该使用其他距离。我对eps的理解是错误的。我应该做什么才能让它按照我的意愿聚集。

python machine-learning cluster-analysis distance dbscan
2个回答
1
投票

这正是DBSCAN应该如何运作的。

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

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

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


0
投票

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

您正在寻找的可能是Leader聚类。一种较旧且更简单的算法,但没有特别广泛使用 - 聚类的目的是了解数据的结构,而不是强加预定义的结构。

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

© www.soinside.com 2019 - 2024. All rights reserved.