#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:
У вас есть два варианта:
- Увеличьте радиус ваших центральных точек (задается параметром epsilon).
- Уменьшите минимальное количество точек (минут), чтобы определить центральную точку.
Я бы начал с уменьшения параметра 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)
Вы увидите, что на графике нет блочной структуры по диагонали, указывающей на то, что кластеризация не найдет много.
Чтобы улучшить кластеризацию, вам необходимо поработать с данными. Вы можете удалить нерелевантные переменные, у вас могут быть очень искаженные переменные, которые следует преобразовать в первую очередь. Вы также можете попробовать нелинейное встраивание перед кластеризацией.