R kmeans(统计数据)与 Kmeans(地图)
R kmeans (stats) vs Kmeans (amap)
你好 Whosebug 社区,
Iris 数据集上的 运行 kmeans(stats 包)和 Kmeans(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 包的作者发了邮件,post 会回复 when/if 我收到了。
https://cran.r-project.org/web/packages/amap/index.html
amap包的作者,更改了代码,withinss变量的值是方法应用的总和(例如欧氏距离)。
解决此问题的一种方法,给定 Kmeans 函数 (amap) 的 return,重新计算 withinss 的值(误差平方和 (SSE))。
这是我的建议:
# 使用 Kmeans(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)
}
注意。此包中的 pearson 方法在 0.8-14 版本上是错误的(小心!)。
第 325 行根据此 link 中的代码:
你好 Whosebug 社区,
Iris 数据集上的 运行 kmeans(stats 包)和 Kmeans(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 包的作者发了邮件,post 会回复 when/if 我收到了。 https://cran.r-project.org/web/packages/amap/index.html
amap包的作者,更改了代码,withinss变量的值是方法应用的总和(例如欧氏距离)。
解决此问题的一种方法,给定 Kmeans 函数 (amap) 的 return,重新计算 withinss 的值(误差平方和 (SSE))。
这是我的建议:
# 使用 Kmeans(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)
}
注意。此包中的 pearson 方法在 0.8-14 版本上是错误的(小心!)。
第 325 行根据此 link 中的代码: