我正在尝试运行比较两种不同聚类技术的蒙特卡罗模拟。以下代码根据随机聚类生成数据集,然后应用两种聚类技术(kmeans 和稀疏 k 均值)。
我的问题是这三种技术对它们的集群使用不同的标签。例如,我称之为簇 1,kmeans 可能称之为簇 2,稀疏 k 均值可能称之为簇 3。当我重新生成并重新运行时,标签的差异似乎并不一致。有时标签同意,有时不同意。
谁能提供一种“标准化”这些标签的方法,这样我就可以运行 n 次模拟迭代,而不必每次都手动解决标签差异?
我的代码:
library(sparcl)
library(flexclust)
x.generate=function(n,p,q,mu){
c=sample(c(1,2,3),n,replace=TRUE)
x=matrix(rnorm(p*n),nrow=n)
for(i in 1:n){
if(c[i]==1){
for(j in 1:q){
x[i,j]=rnorm(1,mu,1)
}
}
if(c[i]==2){
for(j in 1:q){
x[i,j]=rnorm(1,-mu,1)
}
}
}
return(list('sample'=x,'clusters'=c))
}
x=x.generate(20,50,50,1)
w=KMeansSparseCluster.permute(x$sample,K=3,silent=TRUE)
kms.out = KMeansSparseCluster(x$sample,K=3,wbounds=w$bestw,silent=TRUE)
km.out = kmeans(x$sample,3)
tabs=table(x$clusters,kms.out$Cs)
tab=table(x$clusters,km.out$cluster)
CER=1-randIndex(tab)
x$clusters、km.out$cluster、kms.out$Cs 的样本输出
> x$clusters
[1] 3 2 2 2 1 1 2 2 3 2 1 1 3 1 1 3 2 2 3 1
> km.out$cluster
[1] 3 1 1 1 2 2 1 1 3 1 2 2 3 2 2 3 1 1 3 2
> km.out$Cs
[1] 1 2 2 2 3 3 2 2 1 2 3 3 1 3 3 1 2 2 1 3