2016-10-20 6 views
0

이 질문은feature selection 절차와 관련이 있으며, 기능이 큰 행렬이있는 절차이며 빠른 속도와 원유 속도 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에 의해 2,200,000입니다.

그럼 내 질문은 합리적인 계산 시간에 모든 상관 관계를 얻는 것이 가능한지 여부입니다.

나는 아마도 메모리에 맞지 다음 한 번에 사이 corresponse.vec 하나를 수행 덩어리에 feature.pairs.prod를 분해하는 것이 가장 빠른하지만 자동으로 R 어떤 차원에서 테스트하는 방법을 잘 모르겠어요 것이라고 생각했다

I 이 덩어리가 필요합니다.

다른 옵션 apply에 외적을 계산한다 feature.pairs 위에 기능과 그 사이 response.vec 다음 cor이다.

제안 사항?

+0

을 그것은 가장 합리적인 해결책이 있다는 점에서 매우 유사 feature.pairs.prod 행렬을 청크 (chunk)로 분해하고 반복 해내는 첫 번째 제안. 그래도 feature.mat를 사용하여 시스템 자원에서 청크 크기를 파악하는 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을 모두 생성하여 저장해야합니다.그래서 우리는 메모리 크기가 : n 주어진

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

이제 우리는 4GB에서 메모리 사용량을 제한한다고 가정을, 우리는 k를 해결할 수 :

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