R 轮廓指数的最可靠估计?
我试着从不同的包装中估算轮廓指数。然而,从结果中可以发现一些差异(特别是clusterCrit软件包)。我想知道计算轮廓指数最可靠的方法是什么,以及clusterCrit是如何做到这一点的(因为我无法从它的来源找到id)R 轮廓指数的最可靠估计?,r,k-means,R,K Means,我试着从不同的包装中估算轮廓指数。然而,从结果中可以发现一些差异(特别是clusterCrit软件包)。我想知道计算轮廓指数最可靠的方法是什么,以及clusterCrit是如何做到这一点的(因为我无法从它的来源找到id) set.seed(23123) 数据虽然我不能给你一个绝对的答案,但我会说,我自己曾经错误地实现了轮廓索引,当我修复它时(基于索引所在的原始论文),它与基于cluster::screet的结果相匹配。此外,我假设fpc使用cluster::screet,鉴于cluster.st
set.seed(23123)
数据虽然我不能给你一个绝对的答案,但我会说,我自己曾经错误地实现了轮廓索引,当我修复它时(基于索引所在的原始论文),它与基于cluster::screet
的结果相匹配。此外,我假设fpc
使用cluster::screet
,鉴于cluster.stats
的文档说明了其轮廓
参数:逻辑。如果为TRUE,则计算轮廓统计信息,这需要包簇
。
set.seed(23123)
data<-matrix(rnorm(10000),ncol=100)
sil0<-vector(length=20)
sil1<-vector(length=20)
sil2<-vector(length=20)
sil3<-vector(length=20)
dis = dist(data, method = "euclidean")
for (k in 2:20){
clust<-kmeans(data, k, nstart=20)
# based on cluster package
silhou<-cluster::silhouette(clust$cluster,dis)
sil0[k]<-mean(silhou[,3])
# based on fpc package
statos<-fpc::cluster.stats(dis,clust$cluster)
sil1[k]<-statos$avg.silwidth
# based on NbClust package (copied the part of the NbClust()
# function that calculates this index, end of the post)
sil2[k]<-Indice.S(dis, clust$cluster)
#based on clusterCrit
criteri<-clusterCrit::intCriteria((data),clust$cluster,c("Silhouette"))
sil3[k]<-criteri$silhouette
}
plot(sil0)
lines(sil1)
lines(sil2,col='blue')
lines(sil3,col='red')
Indice.S <- function (d, cl)
{
d <- as.matrix(d)
Si <- 0
for (k in 1:max(cl)) {
if ((sum(cl == k)) <= 1)
Sil <- 1
else {
Sil <- 0
for (i in 1:length(cl)) {
if (cl[i] == k) {
ai <- sum(d[i, cl == k])/(sum(cl == k) - 1)
dips <- NULL
for (j in 1:max(cl)) if (cl[i] != j)
if (sum(cl == j) != 1)
dips <- cbind(dips, c((sum(d[i, cl == j]))/(sum(cl ==
j))))
else dips <- cbind(dips, c((sum(d[i, cl ==
j]))))
bi <- min(dips)
Sil <- Sil + (bi - ai)/max(c(ai, bi))
}
}
}
Si <- Si + Sil
}
Si/length(cl)
}