Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 轮廓指数的最可靠估计?_R_K Means - Fatal编程技术网

R 轮廓指数的最可靠估计?

R 轮廓指数的最可靠估计?,r,k-means,R,K Means,我试着从不同的包装中估算轮廓指数。然而,从结果中可以发现一些差异(特别是clusterCrit软件包)。我想知道计算轮廓指数最可靠的方法是什么,以及clusterCrit是如何做到这一点的(因为我无法从它的来源找到id) set.seed(23123) 数据虽然我不能给你一个绝对的答案,但我会说,我自己曾经错误地实现了轮廓索引,当我修复它时(基于索引所在的原始论文),它与基于cluster::screet的结果相匹配。此外,我假设fpc使用cluster::screet,鉴于cluster.st

我试着从不同的包装中估算轮廓指数。然而,从结果中可以发现一些差异(特别是clusterCrit软件包)。我想知道计算轮廓指数最可靠的方法是什么,以及clusterCrit是如何做到这一点的(因为我无法从它的来源找到id)

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