comment obtenir le nombre optimal de cluster à partir de la sortie de dissimilarité (diana, package cluster R)?

Aug 17 2020

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

1 StupidWolf Aug 17 2020 at 01:08

La NbClustfonction 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")