首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R kmeans (统计数据) vs Kmeans (amap)

R kmeans (统计数据) vs Kmeans (amap)
EN

Stack Overflow用户
提问于 2015-09-07 13:58:52
回答 1查看 1.2K关注 0票数 6

你好,堆栈溢出社区,

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

我不明白为什么在这些条件下,我得到了不同的wss曲线,特别是:使用stats包的“肘部”比使用amap包时要轻得多。

你能帮我理解一下原因吗?非常感谢!

在这里,代码:

代码语言:javascript
复制
# 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-25 15:19:14

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

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

以下是我的建议:

#使用Kmeans (amap)

代码语言:javascript
复制
    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)
    }

请注意。这个包中的pearson方法是错误的(小心!)关于0.8-14版。

根据此链接中的代码,第325行:

T.inl

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32440454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档