问题描述
我正在尝试通过以下方法从聚类包和戴安娜方法(使用的欧氏不相似性)获得的树状图中获得最佳聚类数:
mydatad <- diana(mydata,stand = FALSE)
mydata_dend <- fviz_dend(mydatad,cex = 0.5,k = 2,palette = "jco")
## use factoextra and ggplot2 for visualization
然后我尝试将相异矩阵与NbClust结合使用:
NC <- NbClust(data = NULL,diss = mydatadd,distance = NULL,min.nc = 2,max.nc = 50,method= "single",index = "silhouette")
我收到此错误消息”:
Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") :
missing value where TRUE/FALSE needed
无论我的数据没有缺失值,对于相同的元素,dissim矩阵中的最小值应为0(mydata是〜2000个元素,具有11个变量)。
然后,我试图估计一下损失。距离是使用原始数据并估算欧几里得距离,因此不使用相异矩阵
NC <- NbClust(T2141d,diss = NULL,distance = "euclidean",index = "silhouette")
,我收到以下错误消息:
Error in t(jeu) %*% jeu :
requires numeric/complex matrix/vector arguments
欢迎任何建议,甚至建议采用不同的方法以获得最佳聚类数。 thnx。
解决方法
NbClust
函数需要一个相异矩阵。运行diana
时,返回的对象不是相异矩阵,尽管它是经过计算的。您需要设置keep.diss=TRUE
。在展示如何使用示例数据集返回不相似矩阵之前:
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")