我想在R中构建kmeans聚类算法的动画。动画将显示在2(或3)维中绘制的数据集中的每个观察(行),然后将它们移动到其聚类中每次迭代都按照。
进行为此,我需要在每次迭代时访问观察的坐标。我可以在kmeans包中找到这些吗?
谢谢,
答案 0 :(得分:2)
我认为kmeans()
不会输出这种跟踪信息。最好的方法可能是多次重新运行kmeans()
,继续运行集群中心。
set.seed(1)
clus.1 <- kmeans(iris[,1:2],5,iter.max=1)
clus.2 <- kmeans(iris[,1:2],centers=clus.1$centers,iter.max=1)
clus.3 <- kmeans(iris[,1:2],centers=clus.2$centers,iter.max=1)
changing <- which(apply(cbind(clus.1$cluster,clus.2$cluster,clus.3$cluster),1,sd)>0)
changing
opar <- par(mfrow=c(1,3))
plot(iris[,c(1,2)],col=clus.1$cluster,pch=19,main="Iteration 1")
points(iris[changing,c(1,2)],pch=21,cex=2)
plot(iris[,c(1,2)],col=clus.2$cluster,pch=19,main="Iteration 2")
points(iris[changing,c(1,2)],pch=21,cex=2)
plot(iris[,c(1,2)],col=clus.3$cluster,pch=19,main="Iteration 3")
points(iris[changing,c(1,2)],pch=21,cex=2)
par(opar)
我指出了确实改变集群成员资格的要点;不幸的是,只有一个人会这样做,因为kmeans()
只是收敛得那么快; - )
你写道,你希望“让它们在每次迭代时都进入它们的簇中”。当然,在聚类算法中,点不会移动。所以像这样的颜色编码表示是你最好的选择。
在两个以上的维度中,您可以尝试pairs()
,或者只关注两个维度。准备好解释为什么当投影到二维时,n维聚类看起来不像“簇状”。
答案 1 :(得分:0)
您可以使用tryCatch
自动执行收敛过程,如下所示
set.seed(1337)
df = iris[,1:2]
dfCluster<-kmeans(df,centers=3, iter.max = 1)
plot(df[,1], df[,2], col=dfCluster$cluster,pch=19,cex=2, main="iter 1")
points(dfCluster$centers,col=1:5,pch=3,cex=3,lwd=3)
cent <- list(dfCluster$centers)
max_iter = 10
for (i in 2:max_iter){
tryCatch({
dfCluster <- kmeans(df,centers = dfCluster$centers, iter.max = 1)
done <- TRUE
},
warning=function(w) {done <- FALSE})
cent[[i]] <- dfCluster$centers
if(done) break
}
cent
是每次迭代时具有集群中心的列表
cent
[[1]]
Sepal.Length Sepal.Width
1 6.795833 3.081250
2 5.769231 2.678846
3 5.006000 3.428000
[[2]]
Sepal.Length Sepal.Width
1 6.812766 3.074468
2 5.773585 2.692453
3 5.006000 3.428000
要绘制此图,请参阅How to visualize k-means centroids for each iteration?