如何根据大小过滤DBSCAN生成的集群?

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

我已应用DBSCAN对由点云中每个点的X,Y和Z坐标组成的数据集执行聚类。我想只绘制小于100点的聚类。这是我到目前为止:

clustering = DBSCAN(eps=0.1, min_samples=20, metric='euclidean').fit(only_xy)
plt.scatter(only_xy[:, 0], only_xy[:, 1],
        c=clustering.labels_, cmap='rainbow')
clusters = clustering.components_
#Store the labels
labels = clustering.labels_

#Then get the frequency count of the non-negative labels
counts = np.bincount(labels[labels>=0])

print(counts)

Output: 
[1278  564  208   47   36   30  191   54   24   18   40  915   26   20
   24  527   56  677   63   57   61 1544  512   21   45  187   39  132
   48   55  160   46   28   18   55   48   35   92   29   88   53   55
   24   52  114   49   34   34   38   52   38   53   69]

所以我找到了每个群集中的点数,但我不确定如何只选择小于100点的群集。

python machine-learning scikit-learn unsupervised-learning dbscan
2个回答
1
投票

您可能会发现计数小于100的标签索引:

ls, cs = np.unique(labels,return_counts=True)
dic = dict(zip(ls,cs))
idx = [i for i,label in enumerate(labels) if dic[label] <100 and label >= 0]

然后,您可以将结果索引应用于您的DBSCAN结果和标签(或多或少):

plt.scatter(only_xy[idx, 0], only_xy[idx, 1],
        c=clustering.labels_[idx], cmap='rainbow')

0
投票

我想如果你运行这段代码,你可以获得大小超过100的集群的标签和集群组件:

from collections import Counter
labels_with_morethan100=[label for (label,count) in Counter(clustering.labels_).items() if count>100]
clusters_biggerthan100= clustering.components_[np.isin(clustering.labels_[clustering.labels_>=0], labels_with_morethan100)]
© www.soinside.com 2019 - 2024. All rights reserved.