【问题标题】:How to plot clusters of kmeans in R and show centroids?如何在 R 中绘制 kmeans 簇并显示质心?
【发布时间】:2015-06-05 13:06:08
【问题描述】:

我有一个包含 6497 个实例、12 个属性和一个名为 q(质量)的类变量的数据集。类值可以从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")

上面的代码产生了下面的情节。但正如你所看到的,这些集群并没有以清晰的方式展示。

问题

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

【问题讨论】:

  • 您正在创建一个包含 11 个变量的集群,在二维图上集群看起来没有分离是正常的。顺便说一句,在应用 k-means 之前,我会先尝试减少变量的数量。你可能会有更好的结果
  • 好的,感谢您的澄清。我仍然需要了解 Dim1 和 Dim2 是什么意思?以及是否可以创建类似于此scikit-learn.org/stable/_images/plot_kmeans_digits_0011.png 的绘图这里的类值可能是从 1 到 10,他们选择了 10 个集群
  • 数据没有聚类——至少不使用 kmeans。 引入的集群是没有意义的。没有分离或捕获结构。
  • 这些图块似乎是使用 varonoi 图生成的,它本身没有对数据进行聚类。
  • @Anony-Mousse 你是说葡萄酒数据没有聚类吗??

标签: r cluster-analysis k-means


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我现在将对这个数据集应用 PCA 和其他数据预处理技术,看看它是如何变化的。您能分享一下您是如何制作上述情节的吗?这样我就可以在我的预处理技术之前和之后绘制它,看看它是如何分裂的?此外,您是如何确定 tsd 属性压倒数据的。谢谢!
  • 我不会使用 R,所以无法与您分享 R 代码。我绘制了tsd 属性,k-means 集群将是正交切片,如上图所示。
  • 你用的是matlab还是scipy?我正在寻找一种方法来直观地查看在我使用 PCA、ICA 等对其应用预处理之前/之后数据拆分的情况。我不介意切换工具来实现我所追求的目标。
  • 那么,在您创建的情节中,只考虑了 tsd 属性?
  • 没有。但是当我对数据进行预处理时,我选择了 x 轴 = tsd,它看起来像你的图,数据根据 x 轴进行拆分。
【解决方案2】:

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

阅读?cmdscale了解。

还有一些很好的来源herehere

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

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

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 2014-01-01
    • 2021-03-03
    • 2022-09-28
    • 2019-11-20
    • 2017-03-25
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多