2016-10-03 23 views
1

考慮R中下面的例子:中內存解決我的大標準方程使用`outer`時最小二乘估計

x1 <- rnorm(100000) 
x2 <- rnorm(100000) 
g <- cbind(x1, x2, x1^2, x2^2) 
gg <- t(g) %*% g 
gginv <- solve(gg) 
bigmatrix <- outer(x1, x2, "<=") 
Gw <- t(g) %*% bigmatrix 
beta <- gginv %*% Gw 
w1 <- bigmatrix - g %*% beta 

如果我試圖在我的電腦上運行這樣的事情,它會拋出內存錯誤(因爲bigmatrix太大)。

你知道我怎麼能達到相同的目的,而不會遇到這個問題?

回答

1

這是一個具有100,000個響應的最小二乘問題。您的bigmatrix是響應(矩陣),beta是係數(矩陣),而w1是殘差(矩陣)。

bigmatrix,以及w1,如果形成明確,將每個成本

(100,000 * 100,000 * 8)/(1024^3) = 74.5 GB 

這是過於龐大。

由於對每個響應的估計是獨立的,所以實際上不需要一次性形成bigmatrix並嘗試將其存儲在RAM中。我們可以形成它瓷磚通過瓷磚,並使用迭代過程:形成一個瓷磚,使用瓷磚,然後丟棄它。例如,下面考慮尺寸100,000 * 2,000的瓦,與存儲器大小:

(100,000 * 2,000 * 8)/(1024^3) = 1.5 GB 

通過這樣的迭代過程,存儲器使用實際上是在控制之下。

x1 <- rnorm(100000) 
x2 <- rnorm(100000) 
g <- cbind(x1, x2, x1^2, x2^2) 
gg <- crossprod(g) ## don't use `t(g) %*% g` 
## we also don't explicitly form `gg` inverse 

## initialize `beta` matrix (4 coefficients for each of 100,000 responses) 
beta <- matrix(0, 4, 100000) 

## we split 100,000 columns into 50 tiles, each with 2000 columns 
for (i in 1:50) { 
    start <- 2000 * (i-1) + 1 ## chunk start 
    end <- 2000 * i ## chunk end 
    bigmatrix <- outer(x1, x2[start:end], "<=") 
    Gw <- crossprod(g, bigmatrix) ## don't use `t(g) %*% bigmatrix` 
    beta[, start:end] <- solve(gg, Gw) 
    } 

注意,不要試圖計算剩餘矩陣w1,因爲這將花費74.5 GB。如果您在以後的工作中需要殘餘矩陣,您仍然應該嘗試將其分解爲多個瓷磚並逐一工作。

你不需要擔心這裏的循環。每次迭代中的計算足夠昂貴,以分攤循環開銷。

+0

謝謝!這非常有幫助! – user17645