2016-10-20 8 views
0

Этот вопрос расширяет this post, относящийся к процедуре machine learningfeature selection, где у меня есть большая матрица функций, и я бы хотел быстро и грубо выполнить feature selection, измеряя correlation между внешним продуктом между каждой парой признаков и ответом, так как я буду использовать random forest или boostingclassifier.Память и эффективное время корреляции между каждой колонкой в ​​большой матрице и векторе

Количество функций ~ 60 000, а количество ответов - ~ 2 200 000.

Учитывая неограниченную память, возможно, самый быстрый способ пойти об этом будет генерировать matrix где столбцы являются внешними продуктами всех пар функций и использовать cor этого matrix против реакции. В меньшей размерности, например:

set.seed(1) 
feature.mat <- matrix(rnorm(2200*100),nrow=2200,ncol=100) 
response.vec <- rnorm(2200) 

#generate indices of all unique pairs of features and get the outer products: 
feature.pairs <- t(combn(1:ncol(feature.mat),2)) 
feature.pairs.prod <- feature.mat[,feature.pairs[,1]]*feature.mat[,feature.pairs[,2]] 

#compute the correlation coefficients 
res <- cor(feature.pairs.prod,response.vec) 

Но для моих реальных размеров feature.pairs.prod является 2200000 по 1,799,970,000, которые, очевидно, не могут быть сохранены в памяти.

Так что мой вопрос в том, как и как можно получить все корреляции в разумное время вычислений?

Я думал, что, возможно разрушение feature.pairs.prod на куски, которые помещаются в памяти, а затем сделать cor между ними и response.vec один в то время, будет самым быстрым, но я не уверен, как автоматически проверить в R каких размерах я нужны эти куски.

Другой вариант заключается в apply функция над feature.pairs, которая будет вычислять внешний продукт, а затем cor между этим и response.vec.

Любые предложения?

+0

Это очень похоже в том смысле, что наиболее разумным решением является мое первое предложение в том, чтобы разбить матрицу feature.pairs.prod на куски и зацикливать на них. Есть ли способ R определить размер куска из ресурсов моей системы, учитывая feature.mat? – dan

ответ

1

Да, кусочно-математическое вычисление - это путь. Аналогично это делается и в Out of memory when using outer in solving my big normal equation for least squares estimation.

шаги не должны быть изменены:

set.seed(1) 
feature.mat <- matrix(rnorm(2200*100),nrow=2200,ncol=100) 
response.vec <- rnorm(2200) 

#generate indices of all unique pairs of features and get the outer products: 
feature.pairs <- t(combn(1:ncol(feature.mat),2)) 
j1 <- feature.pairs[,1] 
j2 <- feature.pairs[,2] 

Но тогда нам нужно разбить j1 и j2 на куски:

## number of data 
n <- nrow(feature.mat) 
## set a chunk size 
k <- 1000 
## start and end index of each chunk 
start <- seq(1, length(j1), by = k) 
end <- c(start[-1] - 1, length(j1)) 

## result for the i-th chunk 
chunk_cor <- function (i) { 
    jj <- start[i]:end[i] 
    jj1 <- j1[jj]; jj2 <- j2[jj] 
    feature.pairs.prod <- feature.mat[,jj1] * feature.mat[,jj2] 
    cor(feature.pairs.prod,response.vec) 
    } 

## now we loop through all chunks and combine the result 
res <- unlist(lapply(1:length(start), chunk_cor)) 

Основная проблема заключается в том, чтобы решить k.

Как показано в связанном ответе, мы можем рассчитать объем памяти памяти. Если у вас есть n строк и k столбцов (размер куска), то стоимость памяти для матрицы n * k равна n * k * 8/1024/1024/ 1024 GB. Вы можете установить ограничение на запись при записи; то с n известно, вы можете решить k.

Есть чек на стоимость памяти для функции f: feature.mat[,jj1], feature.mat[,jj2] и feature.pairs.prod все должны быть созданы и сохранены.Таким образом, мы имеем размер памяти:

3 * n * k * 8/1024/1024/ 1024 GB 

Теперь предположим, что мы хотим, чтобы ограничить объем памяти под 4GB, учитывая n, мы можем решить k:

k <- floor(4 * 2^30/(24 * n)) 

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

  • Нет связанных вопросов^_^