2013-08-31 3 views
1

Я собираю и создаю теплоизоляцию из довольно маленькой матрицы (5000 строк по 200 столбцов), но я нахожу, что со стандартными heatmap-подобными функциями в R это требуется навсегда. Пример:Ускорение создания кластеризации/создания тепловой карты

data <- replicate(5000, rnorm(200)) 
aheatmap(data, dist="correlation") 

(это использование aheatmap из пакета NMF: http://cran.r-project.org/web/packages/NMF/index.html)

результаты кажутся немного быстрее при использовании euclidean, а не correlation расстояния. Есть ли способ ускорить это?

уточнить Я заинтересован только в кластеризация столбцы не строки, так что я часто проходят aheatmap аргумент Rowv=FALSE

+1

Если вы профилируете 'aheatmap', вы увидите, что большую часть времени тратите на' grid.Call.graphics' и 'dist'. Я бы рассмотрел способы агрегирования данных перед построением графика. Выход не выглядит так, как будто это высокое разрешение в тепловой карте. – Roland

+0

@Roland: Я думаю, что dist нужно вычислить 200, выбрать 2 раза, чтобы вычислить все пары ... не уверен, как этого избежать, но я не понимаю, почему вычисления корреляции настолько медленны в R – user248237dfsf

ответ

1

Ваша проблема в том, что вы делаете гораздо больше сравнений в dist, чем вы могли подозревать. Вы вычисляете выберите 2, а не выберите 2 сравнения. Возможно, это не то, чего вы хотите, но это делается в коде.

Как отмечает @Roland, большая часть времени проводится в dist, что также дает понять, что это проблема. Вот пример на моей машине:

data <- replicate(1500, rnorm(200)) 
system.time(aheatmap(data, dist="correlation")) 
    user system elapsed 
    27.69 0.64 28.33 
system.time(dist(1 - cor(data))) # A line that is in aheatmap 
    user system elapsed 
    21.26 0.02 21.28 

dist функция реализуется с помощью функции C в R, так что можно было бы ожидать, что это будет быстро.

Когда вы запустите cor(data), он даст вам матрицу 5000x5000 (или 1500x1500 в моем меньшем тестовом случае), который затем используется dist. Это означает, что мой компьютер вычисления

choose(1500,2)/21 
[1] 53535.71 

примерно 53535.71 сравнений в секунду, что довольно быстро, я думаю. Вы не получите большой разницы, если не уменьшите количество сравнений.


Если вы хотите, чтобы остановить вычисления кластеризацию для ваших 5000 столбцов, вы можете передать NAColv к аргументу, как указано в ?aheatmap.

aheatmap(data,distfun="correlation",Rowv=NA) # No clustering on rows. 
aheatmap(data,distfun="correlation",Colv=NA) # No clustering on columns. 

Следует отметить, что прохождение FALSE будет по-прежнему вычислять dendogram (медленная часть), но она не будет отображать его, в то время как NA не будет даже вычислить dendogram.

+0

Поскольку я хочу только скопировать столбцы, как я могу получить его, чтобы сделать только 200, выберите 2 вычисления по крайней мере? Нет необходимости делать 5000 выбрать 2, так как я не группирую строки – user248237dfsf

+0

У вас 5000 столбцов. Если вы хотите группировать столбцы, вам потребуется 5000 выбрать 2 сравнения. Однако см. Мое обновление для отключения дендрограмм строк или столбцов. – nograpes

0

Одна простая вещь, которую вы можете сделать, это (по крайней мере, с точки зрения случайных данных), чтобы переключить колонны и ряды:

data <- replicate(200, rnorm(2000)) 
system.time(aheatmap(data, dist="euclidean",Colv=F)) 
user 15.048 sys 0.028 elapsed 15.370 

data <- replicate(2000, rnorm(200)) 
system.time(aheatmap(data, dist="euclidean",Rowv=F)) 
user 19.508 sys 0.164 elapsed 22.043 

Кажется, что последовательная прибыль.

Функция, похоже, ничего не предлагает в документации с точки зрения ее ускорения, и у меня нет опыта с самой функцией/пакетом.

+0

Я не уверен, что есть получить, если вы кластерируете только столбцы и говорите Heatmap, чтобы игнорировать строки; то порядок всегда ~ 200 вместо 5000. Также этот выигрыш маргинален ... Я не понимаю, почему это занимает больше минуты или двух, но здесь требуется 15-20 минут (!). – user248237dfsf

+0

@ user248237dfsf Я взял наименьшую разницу между ними. В некоторых случаях это половина времени. Может быть, это плохо написанный код, я не знаю. Кажется, мне почему-то нарисовать все, что может быть частью замедления. Кроме того, я игнорирую это, чтобы рассказать одно измерение, как вы сказали? – PascalVKooten

Смежные вопросы