R: Как идентифицировать и маркировать группы кластеров в дендрограмме (созданной hclust)? - PullRequest
0 голосов
/ 08 сентября 2018

Я использовал hclust для идентификации кластеров в моих данных и определения природы этих кластеров. Ниже приведена очень упрощенная версия:

gg <- c(1,2,4,3,3,15,16)
hh <- c(1,10,3,10,10,18,16)
z <- data.frame(gg,hh)
means <- apply(z,2,mean)
sds <- apply(z,2,sd)
nor <- scale(z,center=means,scale=sds) 
d <- dist(nor, method = "euclidean")
fit <- hclust(d, method="ward.D2")
plot(fit)
rect.hclust(fit, k=3, border="red")  
groups <- cutree(fit, k=3) 
aggregate(nor,list(groups),mean)

Используя агрегат, я вижу, что эти три кластера включают в себя кластер с низкими значениями переменных gg и hh, кластер с низким gg и средним значением hh, а также кластер с высокими значениями gg и high hh

Как я могу увидеть, где они находятся на дендрограмме (до сих пор я могу только определить, изучив размеры групп и сравнив их с размерами на дендрограмме)? И как я могу как-то пометить эти группы кластеров на дендрограмме (например, добавить что-то вроде «low», «med», «high» имена над каждым кластером)? Я предпочитаю ответы в базе R

1 Ответ

0 голосов
/ 08 сентября 2018

К сожалению, без использования пакета dendextend, нет простых опций, доступных для маркировки. Ближайшая ставка - использовать аргумент border в формуле rect.hclust(), чтобы закрасить прямоугольники ... но это не весело. Взгляните на - http://www.sthda.com/english/wiki/beautiful-dendrogram-visualizations-in-r-5-must-known-methods-unsupervised-machine-learning.

В этом случае с 2 столбцами я бы порекомендовал просто построить z data.frame и раскрасить или сгруппировать визуально по вашему groups. Если вы пометите точки, это еще больше сравнимо с дендограммой Смотрите этот пример:

# your data
gg <- c(1,2,4,3,3,15,16)
hh <- c(1,10,3,10,10,18,16)
z <- data.frame(gg,hh)

# a fun visualization function
visualize_clusters <- function(z, nclusters = 3, 
                           groupcolors = c("blue", "black", "red"), 
                           groupshapes = c(16,17,18), 
                           scaled_axes = TRUE){
  nor <- scale(z) # already defualts to use the datasets mean, sd)
  d <- dist(nor, method = "euclidean")
  fit <<- hclust(d, method = "ward.D2") # saves fit to the environment too
  groups <- cutree(fit, k = nclusters) 

  if(scaled_axes) z <- nor
  n <- nrow(z)
  plot(z, main = "Visualize Clusters",
       xlim = range(z[,1]), ylim = range(z[,2]),
       pch = groupshapes[groups], col = groupcolors[groups])
  grid(3,3, col = "darkgray") # dividing the plot into a grid of low, medium and high
  text(z[,1], z[,2], 1:n, pos = 4)

  centroids <- aggregate(z, list(groups), mean)[,-1]
  points(centroids, cex = 1, pch = 8, col = groupcolors)
  for(i in 1:nclusters){
    segments(rep(centroids[i,1],n), rep(centroids[i,2],n), 
             z[groups==i,1], z[groups==i,2], 
             col = groupcolors[i])
  }
  legend("topleft", bty = "n", legend = paste("Cluster", 1:nclusters), 
         text.col = groupcolors, cex = .8)
}

Теперь мы можем построить их вместе:

par(mfrow = c(2,1))
visualize_clusters(z, nclusters = 3, groupcolors = c("blue", "black", "red"))
plot(fit); rect.hclust(fit, 3, border = rev(c("blue", "black", "red")))
par(mfrow = c(1,1)

enter image description here

Запишите сетку для вашего обследования глаз низкого-низкого-низкого-среднего-высокого-высокого уровня.

Я люблю отрезки. Попробуйте это на больших данных, таких как:

gg <- runif(30,1,20)
hh <- c(runif(10,5,10),runif(10,10,20),runif(10,1,5))
z <- data.frame(gg,hh)
visualize_clusters(z, nclusters = 3, groupcolors = c("blue", "black", "red"))

enter image description here

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

...