如何在 R 中执行 k 均值聚类
How to perform k-mean clustering in R
我正在尝试探索 creditcard fraud dataset 来学习 R 和 k 均值聚类。但是我在获得最佳簇数时遇到了问题。不幸的是,关于该错误甚至如何在 R 中执行 kmeans 聚类的发现并不多 google。我想知道警告是什么?为什么结果只显示 1 个集群?提前致谢!
代码:
data = read.csv("creditcard.csv")
scaled_data <- scale(data )
wss <- (nrow(scaled_data)-1)*sum(apply(scaled_data,2,var))
for (i in 2:100) wss[i] <- sum(kmeans(scaled_data, centers=i)$withiness)
plot(1:100, wss, type='b', xlab="Clusters", ylab="WSS")
警告:
Warning messages:
1: Quick-TRANSfer stage steps exceeded maximum (= 14240350)
2: did not converge in 10 iterations
3: Quick-TRANSfer stage steps exceeded maximum (= 14240350)
4: did not converge in 10 iterations
您的代码有几个问题。由于您没有提供可重现的数据,让我们使用 R 上可用的示例数据集来完成它:
data(iris)
scaled_iris <- scale(iris[, -5])
由于数据已按比例缩放,所有方差均为 1,因此这就是计算总和所需的全部内容:
wss <- sum(colSums(scaled_iris^2))
wss
# [1] 596
现在是聚类。我将包括@mhovd 提到的参数及其默认值(没有收敛参数)。如果收到警告,请将 iter.max=
增加到 15 或 20 或更多。这并不能保证您对任何数量的组的结果都是最佳的。要增加出现这种情况的可能性,您应该使用 nstart=
参数并将值设置为 5 或更大:
for (i in 2:100) wss[i] <- kmeans(scaled_iris, centers=i, iter.max=10)$tot.withinss
head(wss);tail(wss)
# [1] 596.00000 220.87929 138.88836 113.97017 104.98669 81.03783
# [1] 3.188483 2.688470 2.716485 2.535701 2.497792 2.116150
plot(wss, type='b', xlab="Clusters", ylab="WSS")
请注意,您拼写错误 withinss
并且您没有意识到 kmeans
returns 它们的总和为 tot.withinss
。阅读手册页 ?kmeans
总是好的。请注意,您不需要 1:100,因为如果您只提供一个向量,绘图函数将自动提供连续的整数。
我正在尝试探索 creditcard fraud dataset 来学习 R 和 k 均值聚类。但是我在获得最佳簇数时遇到了问题。不幸的是,关于该错误甚至如何在 R 中执行 kmeans 聚类的发现并不多 google。我想知道警告是什么?为什么结果只显示 1 个集群?提前致谢!
代码:
data = read.csv("creditcard.csv")
scaled_data <- scale(data )
wss <- (nrow(scaled_data)-1)*sum(apply(scaled_data,2,var))
for (i in 2:100) wss[i] <- sum(kmeans(scaled_data, centers=i)$withiness)
plot(1:100, wss, type='b', xlab="Clusters", ylab="WSS")
警告:
Warning messages:
1: Quick-TRANSfer stage steps exceeded maximum (= 14240350)
2: did not converge in 10 iterations
3: Quick-TRANSfer stage steps exceeded maximum (= 14240350)
4: did not converge in 10 iterations
您的代码有几个问题。由于您没有提供可重现的数据,让我们使用 R 上可用的示例数据集来完成它:
data(iris)
scaled_iris <- scale(iris[, -5])
由于数据已按比例缩放,所有方差均为 1,因此这就是计算总和所需的全部内容:
wss <- sum(colSums(scaled_iris^2))
wss
# [1] 596
现在是聚类。我将包括@mhovd 提到的参数及其默认值(没有收敛参数)。如果收到警告,请将 iter.max=
增加到 15 或 20 或更多。这并不能保证您对任何数量的组的结果都是最佳的。要增加出现这种情况的可能性,您应该使用 nstart=
参数并将值设置为 5 或更大:
for (i in 2:100) wss[i] <- kmeans(scaled_iris, centers=i, iter.max=10)$tot.withinss
head(wss);tail(wss)
# [1] 596.00000 220.87929 138.88836 113.97017 104.98669 81.03783
# [1] 3.188483 2.688470 2.716485 2.535701 2.497792 2.116150
plot(wss, type='b', xlab="Clusters", ylab="WSS")
请注意,您拼写错误 withinss
并且您没有意识到 kmeans
returns 它们的总和为 tot.withinss
。阅读手册页 ?kmeans
总是好的。请注意,您不需要 1:100,因为如果您只提供一个向量,绘图函数将自动提供连续的整数。