come ottenere il numero ottimale di cluster dall'output di dissomiglianza (diana, cluster R)?

Aug 17 2020

Sto cercando di ottenere il numero ottimale di cluster da un dendrogramma ottenuto con il pacchetto cluster e il metodo diana (dissomiglianza euclidea usata) con quanto segue:

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

quindi provo a utilizzare la matrice di dissomiglianza con NbClust:

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

e ricevo questo messaggio di errore ":

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

tuttavia i miei dati non hanno valori mancanti, i valori più bassi nella matrice dissim dovrebbero essere 0 per elementi identici (mydata è ~ 2000 elementi, 11 variabili).

Poi ho provato a stimare il dissim. distanza utilizzando i dati originali e stimando la distanza euclidea, quindi non utilizzando la matrice di dissomiglianza

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

e ricevo il seguente messaggio di errore:

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

eventuali suggerimenti sono ben accetti, anche suggerimenti per metodi diversi per ottenere il numero ottimale di cluster. thnx.

Risposte

1 StupidWolf Aug 17 2020 at 01:08

La NbClustfunzione richiede una matrice di dissomiglianza. Quando si esegue diana, l'oggetto restituito non è una matrice di dissomiglianza, sebbene sia stato calcolato. Devi impostare keep.diss=TRUE. Prima di mostrare come restituire la matrice di dissomiglianza utilizzando un set di dati di esempio:

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