使用'outer'求解最小二乘估计的大法方程时内存不足

使用'outer'求解最小二乘估计的大法方程时内存不足,r,out-of-memory,regression,linear-regression,least-squares,R,Out Of Memory,Regression,Linear Regression,Least Squares,考虑R中的以下示例: 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 %*%

考虑R中的以下示例:

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

x1这是一个有100000个响应的最小二乘问题。您的
bigmatrix
是响应(矩阵),
beta
是系数(矩阵),而
w1
是残差(矩阵)

bigmatrix
,以及
w1
,如果明确形成,则每种成本都会增加

(100,000 * 100,000 * 8) / (1024 ^ 3) = 74.5 GB
这个太大了

由于每个响应的估计都是独立的,因此实际上不需要一次性形成
bigmatrix
,并尝试将其存储在RAM中。我们可以一块一块地形成它,并使用一个迭代过程:形成一块,使用一块,然后丢弃它。例如,下面考虑的是具有内存大小的维度为
100000*2000
的磁贴:

(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)
   }
x1