簡體   English   中英

使用“outer”求解最小二乘估計的大正態方程時內存不足

[英]Out of memory when using `outer` in solving my big normal equation for least squares estimation

考慮以下 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

如果我嘗試在我的電腦上運行這樣的東西,它會拋出一個內存錯誤(因為bigmatrix太大了)。

你知道我怎樣才能在不遇到這個問題的情況下實現同樣的目標嗎?

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

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

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

這太大了。

由於每個響應的估計是獨立的,因此真的沒有必要bigmatrix形成bigmatrix並嘗試將其存儲在 RAM 中。 我們可以一塊一塊地形成它,並使用一個迭代過程:形成一個 tile,使用一個 tile,然后丟棄它 例如,下面考慮一個尺寸為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。 如果以后的工作中需要殘基,還是盡量把它拆成瓦片,一一處理。

您無需擔心這里的循環。 每次迭代中的計算成本足以分攤循環開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM