как получить оптимальное количество кластеров из вывода несходства (diana, cluster R package)?
Я пытаюсь получить оптимальное количество кластеров из дендрограммы, полученной с помощью пакета кластеров и метода дианы (используется евклидово несходство) со следующим:
mydatad <- diana(mydata, stand = FALSE)
mydata_dend <- fviz_dend(mydatad, cex = 0.5, k = 2, palette = "jco")
## use factoextra and ggplot2 for visualization
затем я пытаюсь использовать матрицу несходства с NbClust:
NC <- NbClust(data = NULL, diss = mydatadd, distance = NULL, min.nc = 2, max.nc = 50, method= "single", index = "silhouette")
и я получаю это сообщение об ошибке ":
Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") :
missing value where TRUE/FALSE needed
однако в моих данных нет пропущенных значений, самые низкие значения в матрице disim должны быть равны 0 для идентичных элементов (mydata составляет ~ 2000 элементов, 11 переменных).
Затем я попытался оценить диссим. расстояние, используя исходные данные и оценивая евклидово расстояние, таким образом, не используя матрицу несходства
NC <- NbClust(T2141d, diss = NULL, distance = "euclidean", min.nc = 2, max.nc = 50, method= "single", index = "silhouette")
и я получаю следующее сообщение об ошибке:
Error in t(jeu) %*% jeu :
requires numeric/complex matrix/vector arguments
любые предложения приветствуются, даже предложения о различных методах получения оптимального количества кластеров. thnx.
Ответы
NbClust
Функция требует матрицы несходства. При запуске diana
возвращаемый объект не является матрицей несходства, хотя он был рассчитан. Вам нужно установить keep.diss=TRUE
. Прежде чем я покажу, как вернуть матрицу несходства на примере набора данных:
library(factoextra)
library(cluster)
mydata=data.frame(matrix(runif(2000*11),ncol=11))
mydatad <- diana(mydata, stand = FALSE,keep.diss=TRUE)
# check the dissimilarity matrix stored
class(mydatad$diss) [1] "dissimilarity" "dist" NC <- NbClust(data = NULL, diss = mydatad$diss,
distance = NULL, min.nc = 2, max.nc = 50,
method= "single", index = "silhouette")