Kmeans内部和内部群集排序

Ron*_*man 5 r

我想知道其他人正在做什么与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),]
Run Code Online (Sandbox Code Playgroud)

给我一个在簇列上排序的data.frame.订购行的最佳方法是什么,以便8个集群按其各自的方式排序?

其次,您是否建议将每个群集中的行从最高平均值排序到最低?这将对数据进行更有条理的观察,但可能会欺骗一个非谨慎的观察者来推断他可能不应该做的事情.如果你的确推荐这个,你会如何最有效地做到这一点?

Rei*_*son 4

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

有一个用于序列化的 R 包,名为seriation,它有一个小插图,您可以直接从 CRAN获取

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

好的 - 根据您上面的评论给出正确的答案。首先是一些虚拟数据 - 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)
Run Code Online (Sandbox Code Playgroud)

产量:

原始和重新排序的热图