2016-10-20 5 views
0

この質問は、machine learningfeature selectionの手順に関連して、this postに拡張されています。高速行列と粗行列を実行したいfeature selectionrandom forestまたはboostingclassifierを使用するので、フィーチャの各ペアとレスポンスの間の外積の間のcorrelationを測定します。大きな行列とベクトルの各列間の相関のメモリと時間効率の良い競争

フィーチャの数は〜60,000であり、応答の数は〜2,200,000です。無制限のメモリを考えると

は、おそらくこのについて移動する最速の方法は、列が機能のすべてのペアの外側の製品ですmatrixを生成し、応答に対してそのmatrixcorを使用することです。小さな寸法の一例として:

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のためには、明らかに、メモリに格納することはできません1799970000によって220万です。

私の質問は、合理的な計算時間内にすべての相関を得ることができるかどうかです。

私はおそらくメモリに収まるチャンクにfeature.pairs.prodを破壊することを考え、その後、一度にcor 1それらの間とresponse.vecを行う最速になりますが、私は自動的にR何次元で私をテストするかどうかはわかりませんしてこれらのチャンクが必要です。

別のオプションはapplyに外積を計算し、そのとresponse.veccorfeature.pairs上関数です。

提案がありますか?

+0

これは、最も合理的な解決策があるという意味ではかなり似ていますfeature.pairs.prodマトリックスをチャンクに分割し、それらをループする最初の提案です。システムのリソースから、チャンクサイズを把握するRの方法はありますか? – 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] 

をしかし、その後、私たちはチャンクにj1j2を解除する必要があります:

手順を変更する必要はありません

## 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 

今すぐn与え、我々は4GBの下にメモリフットプリントを制限したいと、私たちはkを解決することができます:

k <- floor(4 * 2^30/(24 * n)) 
関連する問題