come ottenere il numero ottimale di cluster dall'output di dissomiglianza (diana, cluster R)?
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
La NbClust
funzione 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")