Кластеризация DBSCAN, возвращающая один кластер с точками шума

#r #dbscan

Вопрос:

Я пытаюсь выполнить кластеризацию DBSCAN для данных https://www.kaggle.com/arjunbhasin2013/ccdata. Я очистил данные и применил алгоритм.

 data1 <- read.csv('C:\Users\write\Documents\R\data\Project\Clustering\CC GENERAL.csv')

head(data1)

data1 <- data1[,2:18]

dim(data1)

colnames(data1)

head(data1,2)

#to check if data has empty col or rows
library(purrr)
is_empty(data1)

#to check if data has duplicates
library(dplyr)
any(duplicated(data1))

#to check if data has NA values
any(is.na(data1))
data1 <- na.omit(data1)
any(is.na(data1))
dim(data1)
 

Алгоритм был применен следующим образом.

 #DBSCAN
data1 <- scale(data1)

library(fpc)
library(dbscan)

set.seed(500)
#to find optimal eps
kNNdistplot(data1, k =  34)
abline(h = 4, lty = 3)
 

введите описание изображения здесь

На рисунке показано «колено» для определения значения «eps». Поскольку для кластеризации необходимо учитывать 17 атрибутов, я взял k=17*2 =34.

 db <- dbscan(data1,eps = 4,minPts = 34)
db
 

Результат, который я получил, таков: «Кластеризация содержит 1 кластер(ы) и 147 точек шума».

Независимо от того, какие значения я изменяю для eps и minPts, результат один и тот же.

Может ли кто-нибудь сказать, где я ошибся?

Заранее спасибо.

Комментарии:

1. вероятно, вам следует начать с масштабирования ваших данных.

2. @det Я масштабировал и применил алгоритм.. это все еще один кластер с точками шума.

Ответ №1:

У вас есть два варианта:

  1. Увеличьте радиус ваших центральных точек (задается параметром epsilon).
  2. Уменьшите минимальное количество точек (минут), чтобы определить центральную точку.

Я бы начал с уменьшения параметра minPts, так как я думаю, что он очень высок, и поскольку он не находит точек в пределах этого радиуса, он не группирует больше точек в группе

Ответ №2:

Типичная проблема с использованием DBSCAN (и кластеризации в целом) заключается в том, что реальные данные обычно не попадают в хорошие кластеры, а образуют одно связное облако точек. В этом случае DBSCAN всегда найдет только один кластер. Вы можете проверить это несколькими способами. Наиболее прямым методом было бы использование парного графика (матрицы диаграмм рассеяния).:

 plot(as.data.frame(data1))
 

Поскольку у вас много переменных, диаграммы рассеяния очень малы, но вы можете видеть, что точки находятся очень близко друг к другу почти во всех панелях. DBSCAN соединит все точки в этих плотных областях в единый кластер. k-средства просто разделят плотную область.

Другой вариант-проверить кластеризуемость с помощью таких методов, как НДС или iVAT (https://link.springer.com/chapter/10.1007/978-3-642-13657-3_5).

 library("seriation")

## calculate distances for a small sample
d <- dist(data1[sample(seq(nrow(data1)), size = 1000), ])

iVAT(d)
 

Вы увидите, что на графике нет блочной структуры по диагонали, указывающей на то, что кластеризация не найдет много.

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