Я реализовал алгоритм DBSCAN в R, и я сопоставляю кластерные назначения с реализацией DBSCAN библиотеки fpc. Тестирование выполняется на синтетических данных, которые генерируются, как показано в примере dbscan библиотеки fpc:
n <- 600
x <- cbind(runif(10, 0, 10)+rnorm(n, sd=0.2), runif(10, 0, 10)+rnorm(n, sd=0.3))
Кластеризация выполняется с параметрами, как показано ниже:
eps = 0.2
MinPts = 5
Я сравниваю назначения кластера fpc::dbscan
с моей реализацией dbscan
. Максимум запусков показывает, что каждая точка была классифицирована одинаково обеими реализациями.
Но бывают случаи, когда 1 или 2 точки, а в редких случаях 5 или 6 точек назначаются другим кластерам в моей реализации, чем в реализации fpc. Я заметил, что отличается только классификация пограничных точек. После построения графика я увидел, что точки, чье членство в кластере не совпадает в реализациях, находятся в таком положении, что их можно отнести к любому из окружающих его кластеров, в зависимости от того, из исходной точки какого кластера они были обнаружены первыми.
Я показываю изображение со 150 точками (во избежание беспорядка), где классификация по 1 точке отличается. Обратите внимание, что номер кластера точек несоответствия в моей реализации всегда больше, чем в реализации fpc.
Верхняя вставка — fpc::dbscan, нижняя вставка — моя реализация dbscan
Примечание Точка, отличающаяся от моей реализации, помечена восклицательным знаком (!) Я также загружаю увеличенные изображения раздела несоответствия:
+
— основные точки
o
— граничные точки
—
— точки шума
] !
выделяет отличающуюся точку
треугольники — это основные точки цветные круги — это граничные точки черные кружки — шумовые точки
РЕДАКТИРОВАТЬ
По запросу Anony-Mousse
В разных случаях иногда кажется, что моя реализация правильно классифицировала точку несоответствия, и иногда кажется, что реализация fpc правильно классифицировала несоответствие. См. ниже:
fpc::dbscan (с треугольными диаграммами), кажется, правильно классифицировал точку несоответствия
моя реализация dbscan (с + диаграммами), кажется, правильно классифицировала точку несоответствия
Я новичок в кластерном анализе, поэтому у меня есть еще один вопрос: допустимы ли такие различия?
В моей реализации я сканирую от первой точки до последней точки, как указано, также в fpc::dbscan
точки сканируются в том же порядке. В таком случае обе реализации должны были обнаружить точку несоответствия (отмеченную !
) из одного и того же центра кластера.Также я сгенерировал несколько случаев, когда fpc::dbscan
помечает точку как шум, но моя реализация назначает ее некоторым кластерам. В этом случае, почему возникает эта разница?
Сегменты кода по запросу.