k均值和肘法对同一数据和同一中心产生不同的图形。

时间:2015-03-19 08:00:19

标签: r k-means

我试图从eblow图中找到最佳的簇大小。 问题是我每次运行代码时都会产生不同的图形。

    par(mfrow=c(2,2))
    for(i in 1:4){
      data <- read.csv(file = "C:/Users/sd0298/Desktop/data.csv", header =  TRUE)
      wss <- (nrow(data)-1)*sum(apply(data,2,var))
      for (i in 2:15) {
        wss[i] <- sum(kmeans(data, centers=i, iter.max = 500, nstart = 1, algorithm  = "Lloyd" , trace =  TRUE)$withinss)
      }
      plot(1:15, wss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares", main="SSE vs Cluster levels",cex.axis = 0.8)

    }

enter image description here 每次当我尝试为同一个中心绘制聚类并使用相同的数据时,它会产生不同的图形。

    par(mfrow=c(2,2))
    for(i in 1:4){
      data <- read.csv(file = "C:/Users/sd0298/Desktop/data.csv", header =  TRUE)
      wss <- (nrow(data)-1)*sum(apply(data,2,var))
      km <- kmeans(data, centers=4, iter.max = 500, nstart = 1, algorithm  = "Lloyd" , trace =  TRUE)  
      clusplot(data, km$cluster, color=TRUE, shade=T, span=T, col.p = c("#666666"),   lines=0 ,plotchar=F,  sub = "" ,main = "", labels=5)            
    }

enter image description here

任何人都可以告诉我出了什么问题并告诉我如何在中心和数据没有变化的情况下重现同一个集群。

1 个答案:

答案 0 :(得分:4)

您正在对R kmeans()功能进行以下调用:

km <- kmeans(data, centers=4, iter.max = 500, nstart = 1, algorithm  = "Lloyd" , trace =  TRUE)

Wikipedia page for Lloyd's k-means algorithm声明如下:

  

Lloyd的算法首先在输入域中初始放置一些数量为k的点站点。在网格平滑应用中,这些将是要平滑的网格的顶点;在其他应用中它们可以随机放置,或者通过将适当大小的均匀三角形网格与输入域相交。

R&#39; kmeans正在使用随机初始条件。 nstart参数控制尝试的随机初始化次数。换句话说,如果您多次运行Lloyd的算法,那么您生成的集群可能不会完全相同。

但是,您可以将此非确定性行为视为验证群集准确性的机会。如果您多次运行Lloyd,并且您不断获得类似的集群,那么这意味着集群是有意义的。 如果多次运行k-means会产生非常不同的结果,则表明它们不可靠。