2015-09-07 128 views
5

你好计算器社区,[R k均值(统计数据)与K均值(AMAP)

我跑虹膜数据集k均值(统计包)和K均值(AMAP包)。在这两种情况下,我使用相同的算法(Lloyd-Forgy),相同的距离(euclidean),相同数量的初始随机集(50),相同的最大迭代次数(1000)的k值(从2到15)。我也在这两种情况下使用相同的种子(4358)。

我不明白为什么在这些情况下我会得到不同的wss曲线,尤其是:使用stats软件包的“elbow”比使用amap软件包时要少得多。

你能帮我理解为什么吗?非常感谢!

下面的代码:

# data load and scaling 
newiris <- iris 
newiris$Species <- NULL 
newiris <- scale(newiris) 

# using kmeans (stats) 
wss1 <- (nrow(newiris)-1)*sum(apply(newiris,2,var)) 
for (i in 2:15) { 
    set.seed(4358) 
    wss1[i] <- sum(kmeans(newiris, centers=i, iter.max=1000, nstart=50, 
         algorithm="Lloyd")$withinss) 
    } 

# using Kmeans (amap) 
library(amap) 
wss2 <- (nrow(newiris)-1)*sum(apply(newiris,2,var)) 
for (i in 2:15) { 
    set.seed(4358) 
    wss2[i] <- sum(Kmeans(newiris, centers=i, iter.max=1000, nstart=50, 
         method="euclidean")$withinss) 
    } 

# plots 
plot(1:15, wss1, type="b", xlab="Number of Clusters", 
    ylab="Within groups sum of squares", main="kmeans (stats package)") 
plot(1:15, wss2, type="b", xlab="Number of Clusters", 
    ylab="Within groups sum of squares", main="Kmeans (amap package)") 

编辑: 我通过电子邮件发送的AMAP包的作者,将发布的答复当/如果我得到任何。 https://cran.r-project.org/web/packages/amap/index.html

+0

如果你想进一步挖掘,可以通过键入只函数名和命中输入http的 – pcantalupo

+0

可能重复读取每个功能的源代码://stackoverflow.com/questions/5696381/r-clustering-results-are-different-everytime-i-run – pcantalupo

+0

感谢您的意见@pcantalupo。我正在阅读代码并尝试理解它。对于可能的重复:感谢指针。我正在使用该帖子中建议的种子。我注意到的区别不在同一个函数的不同运行之间,而是在两个不同的实现(统计与地图软件包)之间。方面评论:当我运行Kmeans(amap)时,使用和不使用'set.seed(4358)'我得到的图形是相同的,我认为这很奇怪 – pim

回答

0

的A-MAP包的作者,改变了代码和withinss变量的值是由方法中适用的总和(例如,欧几里德距离)。

解决此问题的一种方法是,给定Kmeans函数(amap)的返回值,重新计算withinss(平方误差总和(SSE))的值。

这里是我的建议:

#使用K均值(AMAP)

library(amap) 

    wss2 <- (nrow(newiris)-1)*sum(apply(newiris,2,var)) 

    for (i in 2:15) { 

      set.seed(4358) 

      ans.Kmeans <- Kmeans(newiris, centers=i, iter.max=1000, nstart=50, method="euclidean") 

      wss <- vector(mode = "numeric", length=i) 

      for (j in 1:i) { 
        km = as.matrix(newiris[which(ans.Kmeans$cluster %in% j),]) 

        ## average = as.matrix(t(apply(km,2,mean))) 
        ## wss[j] = sum(apply(km, 1, function(x) sum((x-average)^2))) 
        ## or       
        wss[j] <- (nrow(km)-1) * sum(apply(km,2,var)) 
      } 

      wss2[i] = sum(wss) 
    } 

注意。在这个包中的皮尔逊方法在版本0.8-14上是错误的(小心!)。在这个环节

线325根据代码:

https://github.com/cran/amap/blob/master/src/distance_T.inl