【问题标题】:Kmeans inter and intra cluster orderingKmeans 簇间和簇内排序
【发布时间】:2017-04-29 02:15:38
【问题描述】:

我想知道其他人在用 K-means 集群排序做什么。我正在制作热图(主要是 ChIP-Seq 数据)并使用自定义热图函数(基于 R 的内置热图函数)获得漂亮的数字。但是,我想要两个改进。首先是根据递减的平均值对我的集群进行排序。比如下面的代码:

fit = kmeans(data, 8, iter.max=50, nstart=10)
d = data.frame(data, symbol)
d = data.frame(d, fit$cluster)
d = d[order(d$fit.cluster),]

给我一​​个按簇列排序的 data.frame。对行进行排序以使 8 个集群按其各自均值的顺序排列的最佳方法是什么?

其次,您是否建议将每个集群内的行从最高平均值排序到最低值?这将对数据施加更有条理的外观,但可能会欺骗不谨慎的观察者来推断他可能不应该的东西。如果你推荐这个,你会怎么做最有效?

【问题讨论】:

  • 是什么意思?用于聚类或其他什么的变量之一?
  • 每个集群中的值的平均值。例如,如果每个集群在 data.frame 中有 30 行,并且 data.frame 有 10 列执行 k-means 聚类,我想要每个集群中 300 个值的平均值。也可以使用质心。
  • 质心不是每个簇的数字,它是 10 维空间中的一个点,因此每个簇质心有 10 个坐标。

标签: r


【解决方案1】:

不是您所问问题的确切答案,但也许您可能会考虑序列化而不是 k-means 聚类。这有点像排序而不是聚类,但最终结果是一系列数据的热图,这听起来类似于您使用 k-means 所做的事情,然后是一个专门排序的热图。

有一个用于序列化的 R 包,称为 seriation,它有一个小插图,你可以得到 directly from CRAN

一旦我编写了一个示例来尝试,我将回答 Q 的细节。

好的 - 根据您上面的评论给出正确答案。首先是一些虚拟数据 - 3 个集群,每个集群包含 10 个样本,分别针对 3 个变量。

set.seed(1)
dat <- data.frame(A = c(rnorm(10, 2), rnorm(10, -2), rnorm(10, -2)),
                  B = c(rnorm(10, 0), rnorm(10, 5), rnorm(10, -2)),
                  C = c(rnorm(10, 0), rnorm(10, 0), rnorm(10, -10)))

## randomise the rows
dat <- dat[sample(nrow(dat)),]
clus <- kmeans(scale(dat, scale = FALSE), centers = 3, iter.max = 50,
               nstart = 10)

## means of n points in each cluster
mns <- sapply(split(dat, clus$cluster), function(x) mean(unlist(x)))

## order the data by cluster with clusters ordered by `mns`, low to high
dat2 <- do.call("rbind", split(dat, clus$cluster)[order(mns)])

## heatmaps
## original first, then reordered:
layout(matrix(1:2, ncol = 2))
image(1:3, 1:30, t(data.matrix(dat)), ylab = "Observations", 
      xlab = "Variables", xaxt = "n", main = "Original")
axis(1, at = 1:3)
image(1:3, 1:30, t(data.matrix(dat2)), ylab = "Observations", 
      xlab = "Variables", xaxt = "n", main = "Reordered")
axis(1, at = 1:3)
layout(1)

产量:

【讨论】:

  • 太棒了!我想试一试,并确保在接受之前不会遇到任何问题。非常感谢您回来!
  • 没有问题@Ron 发表评论或编辑您的问题,我会看到它,因为我最喜欢-d Q
  • 我刚刚有人来找我尝试这样做,但没有得到他们预期的结果。我认为我们可能需要order(rank( 而不是order(order。例如,如果我们有mns &lt;- c(0.18, 0.19, -0.27, 0.24, 0.32, -0.05),我们希望第三组排在第一位,第五组排在最后。如果我们有clus &lt;- 1:6,那么clus[order(order(mns)[clus])] 最后给出第二个元素,但clus[order(rank(mns)[clus])] 正确给出了第五个元素。我们想按聚类均值的等级对数据进行排序。我知道这是一个旧答案,但人们仍然看这里。
  • @GavinKelly 感谢您的跟进;如果有问题,这是否旧无关紧要。排序似乎确实适用于此数据集。然而,我修改了代码块以稍微不同地对数据进行排序,这应该更通用。它对该数据集给出了相同的结果。基本上,我现在按集群将数据拆分为一个列表,每个集群一个组件。然后我使用order(mns)将组件从低到高重新排序,然后rbind()将现在排序的列表组件重新放入数据框中。
猜你喜欢
  • 2014-02-20
  • 2022-11-05
  • 2021-04-21
  • 2017-03-25
  • 2020-01-20
  • 2014-05-09
  • 2021-06-13
  • 2014-01-01
  • 2011-05-16
相关资源
最近更新 更多