DBSCAN EPS некорректное поведение - PullRequest
0 голосов
/ 28 марта 2019
from sklearn.cluster import DBSCAN
import numpy as np
X=np.array([1,9,11,13,14,15,19]).reshape(-1, 1)
db=DBSCAN(eps=3, min_samples=1).fit(X)
print(db.labels_)

печатает:

[0 1 1 1 1 1 2]

, в то время как док говорит:

eps : float, optional
    The maximum distance between two samples for them to be considered
    as in the same neighborhood.

Здесь 9 и 15 находятся в одном кластере, а евклидово расстояние между ними равно 6, что составляет> 3

Чего мне не хватает?

Ответы [ 3 ]

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

Это потому, что точки соединяются вместе. 15 меньше eps из 14, поэтому он включен в этот кластер.

Вы можете увидеть поведение здесь:

X=np.array([1,9,11,13,14,15,17,19]).reshape(-1, 1)
db=DBSCAN(eps=3, min_samples=1).fit(X)

print(db.labels_)

дает: [0 1 1 1 1 1 1 1]

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

Окрестность - это не то же самое, что кластер.

Кластер - это объединение многих окрестностей .Эпсилон - максимальное расстояние от центра одного района;но если вы объединяете несколько окрестностей, расстояния могут стать сколь угодно большими, если ваши данные плотные .

Но описание параметра в sklearn также неверно, а не просто вводит в заблуждение.Когда выполняется неравенство треугольника, точки в одной и той же окрестности могут быть на расстоянии двух эпсилон друг от друга (и даже больше, если вы не используете метрику).

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

Чтобы указать, почему они находятся в одном кластере, позвольте мне дать вам общее объяснение того, что делает DBSCAN.

  1. Построить график, соединив точки данных
  2. Измерение размера каждого подключенного компонента
  3. Отменить компоненты, которые меньше порогового значения, которое в sklearn является параметром min_sample.

esp контролирует максимальное расстояние, для которого вы соединяете две точки данных. Для вашего набора данных с обозначением [a-b], обозначающим соединения, у вас есть:

[9-11], [11-13], [13-14], [14-15]

Таким образом, все эти точки находятся в одном компоненте, и этот компонент больше, чем ваш min_sample параметр, поэтому он считается допустимым кластером.

...