Кластеризация приводит к очень концентрированным кластерам - PullRequest
0 голосов
/ 25 мая 2018

Чтобы понять мою проблему, вам понадобится весь набор данных: https://pastebin.com/82paf0G8

Предварительная обработка: У меня был список заказов и 696 уникальных номеров элементов, и я хотел кластеризоватьих, в зависимости от того, как часто каждая пара предметов заказывается вместе.Я рассчитал для каждой пары предметов количество встречаемости в пределах одного и того же порядка.Т.е. наибольшее количество вхождений составило 489 между двумя предметами.Затем я «вычислил» сходство / корреляцию: Частота / «максимальная частота всех пар» (489).Теперь у меня есть набор данных, который я загрузил.

Сходство / корреляция: Я не знаю, является ли мой подход сходства лучшим в этом случае.Я также попробовал что-то под названием «коэффициент / индекс Жакара», но получил почти такие же результаты.

Набор данных: Набор данных содержит номера материалов V1 и V2.и N - это корреляция между двумя номерами материалов между 0 - 1.

С помощью другого мне удалось создать матрицу расстояний и использовать кластеризацию PAM.

Почему кластеризация PAM? Специалист по данным предлагает следующее: у вас более 95% пар без информации, это делает все эти материалы на одном расстоянии, а один кластер - очень рассеянным.Эта проблема может быть решена с использованием алгоритма PAM, но все же у вас будет очень концентрированная группа.Другим решением является увеличение веса на расстояниях, отличных от одного.

Задача 1: Матрица только 567x567.Я думаю, что для кластеризации мне нужна полная матрица 696x696, хотя многие из них являются нулями.Но я не уверен.

Проблема 2: Кластеризация работает не очень хорошо.Я получаю очень концентрированные кластеры.Многие элементы сгруппированы в первом кластере.Кроме того, в зависимости от того, как вы проверяете кластеры PAM, мои результаты кластеризации плохие.Это связано с анализом сходства?Что еще я должен использовать?Это связано с тем, что 95% данных являются нулями?Должен ли я заменить нули на что-то еще?

Весь код и результаты:

#Suppose X is the dataset
df <- data.table(X)
ss <- dcast(rbind(df, df[, .(V1 = V2, V2 = V1, N)]), V1~V2, value.var = "N")[, -1]
ss <- ss/max(ss, na.rm = TRUE)
ss[is.na(ss)] <- 0
diag(ss) <- 1

Теперь с использованием кластеризации PAM

dd2 <- as.dist(1 - sqrt(ss))
pam2 <- pam(dd2, 4)
summary(as.factor(pam2$clustering))

Но я получаю очень концентрированные кластеры, как:

1   2   3   4 
382 100  23  62

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

@ Мейо, забудь, что сказал ученый о PAM.Поскольку вы упомянули эту работу для диссертации.Тогда, с академической точки зрения, ваше текущее обоснование того, почему требуется PAM, не имеет никакого значения.По сути, вам нужно либо доказать, либо обосновать, почему PAM является необходимостью для вашего тематического исследования.И учитывая природу (непрерывных) переменных в наборе данных, V1, V2, N, я не вижу логики того, почему здесь применяется PAM (, как я упоминал в комментариях, PAM лучше всего работает для смешанных переменных ),Продолжая далее, смотрите этот пост об обнаружении корреляции в R;

# Objective: Detect Highly Correlated variables, visualize them and remove them
data("mtcars")
my_data <- mtcars[, c(1,3,4,5,6,7)]
# print the first 6 rows
head(my_data, 6)
# compute correlation matrix using the cor()
res<- cor(my_data)
round(res, 2) # Unfortunately, the function cor() returns only the correlation coefficients between variables. 
# Visualize the correlation
# install.packages("corrplot")
library(corrplot)
corrplot(res, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)
# Positive correlations are displayed in blue and negative correlations in red color. Color intensity and the size of the circle are proportional to the correlation coefficients. In the right side of the correlogram, the legend color shows the correlation coefficients and the corresponding colors.
# tl.col (for text label color) and tl.srt (for text label string rotation) are used to change text colors and rotations.

#Apply correlation filter at 0.80,
#install.packages("caret", dependencies = TRUE)
library(caret)
highlyCor <- colnames(my_data)[findCorrelation(res, cutoff = 0.80, verbose = TRUE)]
# show highly correlated variables
highlyCor
[1] "disp" "mpg" 

High Correlation

removeHighCor<- findCorrelation(res, cutoff = 0.80) # returns indices of highly correlated variables
# remove highly correlated variables from the dataset
my_data<- my_data[,-removeHighCor]
[1] 32  4

Надеюсь, это поможет.

0 голосов
/ 25 мая 2018

Я не уверен, откуда у вас номер 696.После rbind у вас есть фрейм данных с 567 уникальными значениями для V1 и V2, а затем вы выполняете dcast и получаете матрицу, как и ожидалось, 567 x 567. В кластеризации не вижу проблем с вашими кластерами.

dim(df) # [1] 7659    3

test <- rbind(df, df[, .(V1 = V2, V2 = V1, N)])
dim(test) # [1] 15318     3

length(unique(test$V1)) # 567
length(unique(test$V2)) # 567

test2 <- dcast(test, V1~V2, value.var = "N")[,-1]
dim(test2) # [1] 567 567
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...