嗨,我需要对值小于或等于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的理解是否正确?我应该怎么做才能使其按需聚类。
答案 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。