如何在 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")
上面的代码产生了下面的情节。但正如您所见,集群并未以清晰的方式展示。
问题
- 什么是 Dim1 和 Dim2?
- 我该如何解决这个问题?
- 此外,R 是否提供了一种方法来生成类似于 scikit 生成的用于显示簇和质心的图?
此代码的作者(来自另一个 SO 问题)正在使用 MDS(多维缩放)进行降维来绘制集群。
阅读 ?cmdscale
了解。
是否要进行降维,在聚类之前还是之后,是您的选择,我不确定这段代码中有什么"to fix",更多的是您自己决定想做和情节。
我建议您先尝试在聚类之前减少变量的数量。 11真的很多。它们都有用吗?
另请记住,在应用 k-means 之前需要对变量进行归一化。
不要忘记仔细预处理您的数据!
在您上面显示的图像中,结果 完全由 tsd
属性控制*。基本上没有考虑所有其他数据!
(fsd
属性有一些小的影响,其他的都相形见绌。)
数据集似乎没有很好地聚类。
这是我能得到的最好结果:
有人可能会争辩说这个数据集中有两种类型。但它们并没有很好地分开。它也可能是一个奇形怪状的 单个 簇。
特别是,数据的拆分方式会根据您预处理和缩放数据的方式而发生很大变化。这表明结果不稳定。
我有一个包含 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")
上面的代码产生了下面的情节。但正如您所见,集群并未以清晰的方式展示。
问题
- 什么是 Dim1 和 Dim2?
- 我该如何解决这个问题?
- 此外,R 是否提供了一种方法来生成类似于 scikit 生成的用于显示簇和质心的图?
此代码的作者(来自另一个 SO 问题)正在使用 MDS(多维缩放)进行降维来绘制集群。
阅读 ?cmdscale
了解。
是否要进行降维,在聚类之前还是之后,是您的选择,我不确定这段代码中有什么"to fix",更多的是您自己决定想做和情节。 我建议您先尝试在聚类之前减少变量的数量。 11真的很多。它们都有用吗?
另请记住,在应用 k-means 之前需要对变量进行归一化。
不要忘记仔细预处理您的数据!
在您上面显示的图像中,结果 完全由 tsd
属性控制*。基本上没有考虑所有其他数据!
(fsd
属性有一些小的影响,其他的都相形见绌。)
数据集似乎没有很好地聚类。
这是我能得到的最好结果:
有人可能会争辩说这个数据集中有两种类型。但它们并没有很好地分开。它也可能是一个奇形怪状的 单个 簇。
特别是,数据的拆分方式会根据您预处理和缩放数据的方式而发生很大变化。这表明结果不稳定。