Kmeans меж- и внутрикластерное упорядочение - PullRequest
5 голосов
/ 24 января 2011

Мне интересно, что другие люди делают с порядком кластеров K-средних. Я делаю тепловые карты (в основном из ChIP-Seq данных) и получаю красивые рисунки с пользовательской функцией тепловой карты (на основе встроенной функции R тепловой карты 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 кластеров были в порядке их соответствующих средств?

Во-вторых, вы рекомендуете сортировать строки ВНУТРИ каждого кластера от наивысшего среднего значения к наименьшему? Это навязывает более организованный взгляд на данные, но может обмануть неосторожного наблюдателя в выводе того, что он, возможно, не должен. Если вы порекомендуете это, как бы вы сделали это наиболее эффективно?

1 Ответ

4 голосов
/ 25 января 2011

Не точный ответ на то, что вы спрашиваете, но, возможно, вы могли бы рассмотреть разделение вместо кластеризации k-средних.Это немного похоже на ординацию, а не на кластеризацию, но один конечный результат - это тепловая карта последовательных данных, которая звучит похоже на то, что вы, похоже, делаете с помощью k-средних, за которой следует специально упорядоченная тепловая карта.пакет R для сериации, называемый seriation, и в нем есть виньетка, которую вы можете получить непосредственно из 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)

Выход:

Original and reordered heatmaps

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...