在 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=3
的 sil
元素是 0.8695872 0.8695872 0.8695872 0.8695872 0.8695872
。
我的问题是为什么我在每个 k
中得到相同的元素。我期望不同的 sil
元素,因为每个种子的 pam
结果可能不同,因此 pam
的 average Silhoettes
可能不同!
更新:
最后,我测试了 iris
数据并同时使用了 pam
和 k-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 相比,每次都选择相同的初始质心的可能性要大得多。
对于每个 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=3
的 sil
元素是 0.8695872 0.8695872 0.8695872 0.8695872 0.8695872
。
我的问题是为什么我在每个 k
中得到相同的元素。我期望不同的 sil
元素,因为每个种子的 pam
结果可能不同,因此 pam
的 average Silhoettes
可能不同!
更新:
最后,我测试了 iris
数据并同时使用了 pam
和 k-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 相比,每次都选择相同的初始质心的可能性要大得多。