comment obtenir le nombre optimal de cluster à partir de la sortie de dissimilarité (diana, package cluster R)?
J'essaie d'obtenir le nombre optimal de clusters à partir d'un dendrogramme obtenu avec le package cluster et la méthode diana (dissimilarité euclidienne utilisée) avec ce qui suit:
mydatad <- diana(mydata, stand = FALSE)
mydata_dend <- fviz_dend(mydatad, cex = 0.5, k = 2, palette = "jco")
## use factoextra and ggplot2 for visualization
alors j'essaye d'utiliser la matrice de dissimilarité avec NbClust:
NC <- NbClust(data = NULL, diss = mydatadd, distance = NULL, min.nc = 2, max.nc = 50, method= "single", index = "silhouette")
et j'obtiens ce message d'erreur ":
Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") :
missing value where TRUE/FALSE needed
cependant mes données n'ont pas de valeurs manquantes, les valeurs les plus basses de la matrice dissim doivent être 0 pour des éléments identiques (mydata est ~ 2000 éléments, 11 variables).
Ensuite, j'ai essayé d'estimer le dissim. distance en utilisant les données originales et en estimant la distance euclidienne, donc sans utiliser la matrice de dissimilarité
NC <- NbClust(T2141d, diss = NULL, distance = "euclidean", min.nc = 2, max.nc = 50, method= "single", index = "silhouette")
et j'obtiens le message d'erreur suivant:
Error in t(jeu) %*% jeu :
requires numeric/complex matrix/vector arguments
toute suggestion est la bienvenue, même suggestion de différentes méthodes pour obtenir le nombre optimal de cluster. thnx.
Réponses
La NbClust
fonction nécessite une matrice de dissimilarité. Lorsque vous exécutez diana
, l'objet renvoyé n'est pas une matrice de dissimilarité, bien qu'il ait été calculé. Vous devez définir keep.diss=TRUE
. Avant de montrer comment renvoyer la matrice de dissimilarité à l'aide d'un exemple de jeu de données:
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")