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

时间:2015-04-01 01:31:57

标签: r cluster-analysis k-means

我有一个数据集,它有6497个实例,12个属性和一个名为q(quality)的类变量。类值的范围为3到9.数据可以CSV格式from here

下载

我在这个数据集上做k-means集群,想要绘制它。但是我生成的图似乎有问题,因为我认为它们不代表集群。我想要生成的图是从这个SO答案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")

以上代码生成以下图表。但正如您所看到的,群集未以清晰的方式展示。

enter image description here

问题

  • 什么是Dim1和Dim2?
  • 我该如何解决这个问题?
  • 此外,R是否提供了一种方法来生成类似于scikit生成的用于显示聚类和质心的图?

2 个答案:

答案 0 :(得分:3)

此代码的作者(来自其他SO问题)使用MDS(多维缩放)来减少维度以绘制群集。

阅读?cmdscale以了解。

还有一些好的来源herehere

无论您是想要进行此降维,还是在群集之前或之后,都是您的选择,我不确定是否有什么需要修复&#34;在此代码中,您可以更多地决定要执行的操作和绘图。 我建议你首先尝试减少聚类前的变量数量。 11真的很多。它们都有用吗?

还要记住,在应用k-means之前,需要对变量进行规范化。

答案 1 :(得分:2)

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

在上面显示的图片中,{strong>完全由tsd属性支配*。所有其他数据基本上都没有考虑在内! (fsd属性有一些小的影响,其他属性相形见绌。)

数据集似乎不能很好地聚类。

这是我能得到的最好结果: enter image description here

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

特别是,数据拆分的方式会发生很大变化,具体取决于您预处理和扩展数据的方式。这表明结果不稳定。