在 R 中使用不同的种子获得相同的 pam 平均轮廓

Get the same pam average Silhouettes using different seeds in R

对于每个 k,我使用不同的种子并将每个 pam average Silhouette 添加到 sil 数组。代码如下:

  sil <- numeric(5)
  for(k in 3:10){
    for (i in 1:5){
      set.seed(i)
      PAM<-pam(RFML_table,k)
      sil[[i]]<-PAM$silinfo$avg.width
    }
    minSil[[k]]<-min(sil)
    maxSeed[[k]]<-which.max(sil)
  }
  kClust<-which.max(minSil)
  kSeed<-maxSeed[kClust]

然而,每次,我的 sil 数组的元素都是相等的。例如,k=3sil 元素是 0.8695872 0.8695872 0.8695872 0.8695872 0.8695872 。 我的问题是为什么我在每个 k 中得到相同的元素。我期望不同的 sil 元素,因为每个种子的 pam 结果可能不同,因此 pamaverage Silhoettes 可能不同!

更新:

最后,我测试了 iris 数据并同时使用了 pamk-means。这是代码:

library(cluster)
dni3 <- dimnames(iris3)
ii <- data.frame(matrix(aperm(iris3, c(1,3,2)), ncol = 4,
                        dimnames = list(NULL, sub(" L.",".Length",
                                                  sub(" W.",".Width", dni3[[2]])))),
                 Species = gl(3, 50, labels = sub("S", "s", sub("V", "v", dni3[[3]]))))
all.equal(ii, iris) # TRUE
ii$Species=NULL
dissE <-daisy(ii)
dE2<- dissE^2
minSil<-numeric(10)
maxSeed<-numeric(10)
sil <- numeric(5)
seeds<-numeric(5)

for(k in 3:10){
  for (i in 1:5){
    set.seed(i*1000)
    PAM<-pam(ii,k)
    sil[[i]]<-PAM$silinfo$avg.width
  }
  s=c(s,sil)
  minSil[[k]]<-min(sil)
  maxSeed[[k]]<-which.max(sil)
}
for(k in 3:10){
  for (i in 1:5){
    set.seed(i*1000)
    km <- kmeans(ii,centers =  k)
    sil[[i]]<-mean(silhouette(km$cl, dissE)[,3])
  }
  z=c(z,sil)
  minSil[[k]]<-min(sil)
  maxSeed[[k]]<-which.max(sil)
}

这是 sil 的最后一个循环 pam:

[1] 0.2918482 0.2918482 0.2918482 0.2918482 0.2918482

这是 k-means 的最后一个循环 sil:

[1] 0.3109128 0.4291905 0.4262538 0.3160188 0.2875212

PAM 使用相当复杂的初始化方案来减少之后昂贵的迭代次数。与只选择 k 个随机对象的 k-means 相比,每次都选择相同的初始质心的可能性要大得多。