如何在 R 中绘制 kmeans 簇并显示质心?

How to plot clusters of kmeans in R and show centroids?

我有一个包含 6497 个实例、12 个属性和一个名为 q(质量)的 class 变量的数据集。 class 值的范围是 3 到 9。数据可以 CSV 格式下载 from here

我正在对这个数据集进行 k 均值聚类,并想绘制它。但是我生成的图似乎有问题,因为我认为它们不代表集群。我试图生成的情节是从这个 SO answer How to create a cluster plot in R?

中引用的

这是我正在做的事情

library(vegan)
winequality <- read.csv("wine_nocolor.csv")
express <- winequality[, c("fa", "va", "ca", "rs", "ch", "fsd", "tsd", "d", "p", "s", "a")]
rownames(express) <- winequality$id
str(express) #'data.frame': 6497 obs. of  11 variables
kclus <- kmeans(express,centers= 3, iter.max=1000, nstart=10000) #takes a bit of time
wine_dist <- dist(express)
cmd <- cmdscale(wine_dist) #takes bit of time
groups <- levels(factor(kclus$cluster))
ordiplot(cmd, type = "n") #shows warning that Species scores not available
cols <- c("steelblue", "darkred", "darkgreen")
for(i in seq_along(groups)){
    points(cmd[factor(kclus$cluster) == groups[i], ], col = cols[i], pch = 16)
}

# add spider and hull
ordispider(cmd, factor(kclus$cluster), label = TRUE)
ordihull(cmd, factor(kclus$cluster), lty = "dotted")

上面的代码产生了下面的情节。但正如您所见,集群并未以清晰的方式展示。

问题

此代码的作者(来自另一个 SO 问题)正在使用 MDS(多维缩放)进行降维来绘制集群。

阅读 ?cmdscale 了解。

还有一些不错的来源here and here

是否要进行降维,在聚类之前还是之后,是您的选择,我不确定这段代码中有什么"to fix",更多的是您自己决定想做和情节。 我建议您先尝试在聚类之前减少变量的数量。 11真的很多。它们都有用吗?

另请记住,在应用 k-means 之前需要对变量进行归一化。

不要忘记仔细预处理您的数据!

在您上面显示的图像中,结果 完全由 tsd 属性控制*。基本上没有考虑所有其他数据!fsd 属性有一些小的影响,其他的都相形见绌。)

数据集似乎没有很好地聚类。

这是我能得到的最好结果:

有人可能会争辩说这个数据集中有两种类型。但它们并没有很好地分开。它也可能是一个奇形怪状的 单个 簇。

特别是,数据的拆分方式会根据您预处理和缩放数据的方式而发生很大变化。这表明结果不稳定。