como obter o número ideal de cluster de saída de dissimilaridade (diana, pacote R do cluster)?

Aug 17 2020

Estou tentando obter o número ideal de clusters de um dendrograma obtido com o pacote de cluster e o método diana (usado a dissimilaridade euclidiana) com o seguinte:

mydatad <- diana(mydata, stand = FALSE)
mydata_dend <- fviz_dend(mydatad, cex = 0.5, k = 2, palette = "jco") 
## use factoextra and ggplot2 for visualization

então tento usar a matriz de dissimilaridade com NbClust:

NC <- NbClust(data = NULL, diss = mydatadd, distance = NULL, min.nc = 2, max.nc = 50, method= "single", index = "silhouette")

e recebo esta mensagem de erro ":

Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") : 
  missing value where TRUE/FALSE needed

no entanto, meus dados não têm valores ausentes, os valores mais baixos na matriz dissim devem ser 0 para elementos idênticos (mydata é ~ 2.000 elementos, 11 variáveis).

Então tentei estimar o dissim. distância usando os dados originais e estimando a distância euclidiana, não usando a matriz de dissimilaridade

NC <- NbClust(T2141d, diss = NULL, distance = "euclidean", min.nc = 2, max.nc = 50, method= "single", index = "silhouette")

e recebo a seguinte mensagem de erro:

Error in t(jeu) %*% jeu : 
  requires numeric/complex matrix/vector arguments

quaisquer sugestões são bem-vindas, até mesmo sugestão de métodos diferentes para obter o número ideal de cluster. thnx.

Respostas

1 StupidWolf Aug 17 2020 at 01:08

A NbClustfunção requer uma matriz de dissimilaridade. Quando você executa diana, o objeto retornado não é uma matriz de dissimilaridade, embora tenha sido calculado. Você precisa definir keep.diss=TRUE. Antes de mostrar como retornar a matriz de dissimilaridade usando um conjunto de dados de exemplo:

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