R: выбор функции в распространении сродства - PullRequest
0 голосов
/ 17 марта 2020

Ладья ie здесь за помощью.

Итак, я делаю кластеризацию на наборе данных, используя распространение Affinity, APcluster. Теперь у меня есть несколько проблем, которые я хочу решить:

1: визуализация, очевидно, функция Plot () не любит мою таблицу, когда имеется более 15 функций. Любой способ обойти это?

2: относится к 1, поэтому я подумал, что могу уменьшить функции из таблицы, используя PCA, или проверить корреляцию. Первый даст мне 2-3 ключевых компонента для работы, а второй позволит мне устранить лишние. Тем не менее, PCA работает не очень хорошо, PCA1 и 2 составляют только 22% ...

Так что есть шанс построить все 1016 *, в которых я мог бы случайно выбрать функцию из таблицы и удалите его, запустите APcluster с остальными функциями и повторите этот процесс для всех функций. И сравните полученные результаты кластеризации, чтобы увидеть, какие функции являются избыточными, а какие являются ключевыми игроками.

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

Ниже приведены минимальные ложные данные и мои коды для APcluster:

#minimum dataset
Id <- c(1:30)
timestamp <- rep(c("20200512","20180212","20181204" ),10)
f_1 <- runif (30, 0.0, 20)
f_2 <- runif (30, 0.0, 500)
f_3 <- runif (30, 0.0, 15)
f_4 <- runif (30, 0.0, 8.6)
f_5 <- runif (30, 0.0, 200)
f_6 <- runif (30, 0.0, 250)
f_7 <- runif (30, 0.0, 2000)
f_8 <- runif (30, 0.0, 35)
f_9 <- runif (30, 0.0, 20)
f_10 <- runif (30, 0.0, 14)
f_11 <- runif (30, 0.0, 10)
f_12 <- runif (30, 0.0, 89)

df <- data.frame(Id,timestamp,f_1,f_2,f_3,f_4,f_5,f_6,f_7,f_8,f_9,f_10,f_11,f_12)

#drop labels
sampleID <- df$Id
Time <- df$timestamp
sampleID <-NULL
Time <- NULL
#scale numerical data     
scaled_df <- scale(df[,3:14])

#APcluster
library(apcluster)
apres <- apcluster(negDistMat(r=2), scaled_df, details=TRUE)

show(apres)

plot(apres, df)

1 Ответ

2 голосов
/ 19 марта 2020

Я думаю, что вы не должны быть озабочены выбором переменных для кластеризации, а go впереди визуализации и понимания кластеризации.

Если действительно есть сигнал, то есть некоторые признаки разделения в вашем набор данных, большинство алгоритмов кластеризации будет использовать больше полезных столбцов. Например, в приведенном ниже примере я использую кластер радужной оболочки, но добавил еще 10 бессмысленных столбцов:

library(apcluster)
set.seed(100)
df = iris[,1:4]
df = cbind(df,matrix(rnbinom(nrow(df)*10,mu=10,size=1),ncol=10))
scaled_df = scale(df)
pca = prcomp(scaled_df)
plot(pca$x[,1:2],col=iris$Species)

enter image description here

Вы можете видеть, что выше если вы проецируете на первые ПК, вы все равно можете увидеть то разделение, которое исходило от исходных данных. Если посмотреть на объяснение дисперсии, оно составляет около 30%, что имеет смысл, потому что другие столбцы просто шумовые:

head(100*(pca$sdev^2)/sum( (pca$sdev^2)))
[1] 21.624484  9.839297  9.657884  8.239994  7.875396  7.289238

Теперь, если мы выполняем кластеризацию, мы можем также извлечь идентификатор кластера и не ограничиваться к функции графика, предоставляемой пакетом:

apres <- apcluster(negDistMat(r=2), scaled_df,q=0.01)
clusters = apres@clusters
clusterid = data.frame(
cluster = rep(1:length(clusters),sapply(clusters,length)),
obs = unlist(clusters)
)

clusterid = clusterid[order(clusterid$obs),]
head(clusterid)
      cluster obs
1       2   1
2       2   2
3       2   3
4       2   4
5       2   5
6       2   6

Теперь у нас есть data.frame, который сообщает нам для каждого наблюдения, которое мы предоставили в качестве входных данных, назначенный кластер. Давайте спроецируем это на pca, чтобы увидеть, как оно разделено:

library(RColorBrewer)
COLS = brewer.pal(length(unique(clusterid$cluster)),"Set3")
plot(pca$x[,1:2],col=COLS[clusterid$cluster],pch=20,cex=0.5)

enter image description here

Мы можем посмотреть на переменные, которые содержат сигнал,

plot(df[,1:2],col=COLS[clusterid$cluster],pch=20,cex=0.5)

enter image description here

А те, которые этого не делают:

plot(df[,9:10],col=COLS[clusterid$cluster],pch=20,cex=0.5)

enter image description here

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

...