Поиск кластеров с разницей в значении <0,1 в dbscan - PullRequest
2 голосов
/ 30 апреля 2019

Привет! Мне нужно кластеризовать точки, значения которых меньше или равны 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])]

Если вы видите вышеупомянутые данные, которые я предоставил, 1-я позиция имеет 0,8 ... и 2895-я позиция имеет 0,141 ... Но как их можно сгруппировать, когда я дал eps = 0,1 и метрику = "Манхэттен" (что принимает абсолютную разницу). Что мне здесь не хватает, следует ли мне использовать какое-то другое расстояние. Неужели я неправильно понимаю eps?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Именно так DBSCAN должен работать.

DBSCAN - алгоритм кластеризации на основе плотности. Проще говоря, он начинается со случайной точки p, если в диапазоне epsilon вокруг p есть min_points точек, то он становится центральной точкой. Если две основные точки находятся в пределах диапазона epsilon, они помещаются в один кластер.

Это означает: две точки, расположенные далеко (например, больше эпсилона) друг от друга, могут быть соединены другими центральными точками между ними и, таким образом, принадлежать к одному кластеру

Выбранные вами параметры epsilon и min_points, похоже, приводят к одному большому кластеру (за исключением точки 0)

0 голосов
/ 30 апреля 2019

DBSCAN epsilon не максимальный радиус кластера, но размер step .Кластеры состоят из множества таких шагов, поэтому расстояния могут быть больше.

Что вам нужно, так это, вероятно, кластеризация Leader.Более старый и простой алгоритм, но не особенно широко используемый - целью кластеризации является изучение структуры ваших данных, а не навязывание предопределенной структуры.

Поскольку ваши данные являются одномерными, почему бы неВы просто сортируете данные и затем определяете пороговые значения, которые вам нравятся.Или просто обрежьте по любому желаемому пороговому значению, например, 0, 0,1, 0,2, 0,3 с помощью простых масок x < 0.1, встроенной функциональности numpy.

...