R kmeans(统计数据)与kmeans(amap)

R kmeans(统计数据)与kmeans(amap),r,k-means,R,K Means,大家好,我的社区 我正在Iris数据集上运行kmeans(统计数据包)和kmeans(amap包)。在这两种情况下,我使用相同的算法(Lloyd–Forgy)、相同的距离(欧几里德)、相同数量的初始随机集(50)、相同的最大迭代次数(1000),并测试相同的k值集(从2到15)。对于这两种情况,我也使用相同的种子(4358) 我不明白为什么在这些条件下,我会得到不同的wss曲线,特别是:使用stats包时的“肘部”比使用amap包时要轻得多 你能帮我弄明白为什么吗?多谢 代码如下: # data

大家好,我的社区

我正在Iris数据集上运行kmeans(统计数据包)和kmeans(amap包)。在这两种情况下,我使用相同的算法(Lloyd–Forgy)、相同的距离(欧几里德)、相同数量的初始随机集(50)、相同的最大迭代次数(1000),并测试相同的k值集(从2到15)。对于这两种情况,我也使用相同的种子(4358)

我不明白为什么在这些条件下,我会得到不同的wss曲线,特别是:使用stats包时的“肘部”比使用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)")
#数据加载和缩放

newirisamap软件包的作者更改了代码,withinss变量的值是方法应用的总和(如欧几里德距离)

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

以下是我的建议:

#使用Kmeans(amap)

库(amap)

wss2如果您想进一步挖掘,只需键入函数名并点击enter@pcantalupo,即可阅读每个函数的源代码。我正在阅读代码并试图理解它。对于可能的重复:感谢指针。我正在使用该帖子中建议的种子。我注意到的区别不是相同函数的不同运行之间的差异,而是两种不同实现之间的差异(stats与map包)。旁注:当我运行带有和不带有
set.seed(4358)
的Kmeans(amap)时,我得到的是相同的was图,我认为是weirdIs,在您设置了一次种子之后?是的@Elin,我为每个循环设置了一次种子:在Kmeans(stats)之前和在Kmeans(amap)之前各一次,在两个实例中都是一样的(
set.seed(4358)
)。
    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)
    }