在k的每次迭代中获得每个观测的坐标意味着在R中

时间:2014-04-07 14:16:58

标签: r k-means

我想在R中构建kmeans聚类算法的动画。动画将显示在2(或3)维中绘制的数据集中的每个观察(行),然后将它们移动到其聚类中每次迭代都按照。

进行

为此,我需要在每次迭代时访问观察的坐标。我可以在kmeans包中找到这些吗?

谢谢,

2 个答案:

答案 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)

enter image description here

我指出了确实改变集群成员资格的要点;不幸的是,只有一个人会这样做,因为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?