Как фильтровать кластеры, созданные DBSCAN по размеру? - PullRequest
0 голосов
/ 15 марта 2019

Я применил 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 точек.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете найти индексы этикеток, где у вас есть счет меньше 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 голосов
/ 15 марта 2019

Я думаю, что если вы запустите этот код, вы можете получить метки и кластерные компоненты кластера размером более 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)]
...