簡體   English   中英

使用更少的內存從最小二乘擬合中獲取殘差

[英]Get residuals from least squares fit using less memory

我正在使用相同的預測器和大量響應來擬合最小二乘模型,而我所需要的只是殘差。 qr.resid函數是我發現的最簡單的函數,但它需要的內存比必要的多,因為它內部的Fortran代碼返回一些不必要的東西,這些東西在qr.resid返回結果之前被丟棄。

這意味着當響應數量足夠大時,我的系統必須開始交換內存,並且需要很長時間才能得到答案。 一個接一個地做(在R中有一個循環)比較快,因為它不會交換,但是(可能)比以矢量化方式完成整個事情要慢。

也就是說,當y足夠小而不會導致交換時,此版本會更快:

reslsfit1 <- function (x, y) {
  qr.resid(qr(x),y)
}

但是對於大y來說這個版本更快,因為它不會交換:

reslsfit2 <- function (x, y) {
  x <- unname(x)
  y <- unname(y)
  out <- matrix(NA, ncol=ncol(y), nrow=nrow(y))
  qrx <- qr(x)
  for(i in 1:ncol(y)) {out[,i] <- qr.resid(qrx, y[,i])}
  out
}

有什么建議么? 我更喜歡使用現有的函數(或者至少是現有的算法)而不是自己編寫,因為可能存在數值問題。

這是重新創建問題的代碼; 你必須為你的系統做足夠大的N

set.seed(5)
n <- 1000
N <- 10000 # make this big enough for your system to swap
y <- matrix(rnorm(n*N), ncol=N)
x <- rnorm(n)
r1 <- reslsfit1(x,y)
r2 <- reslsfit2(x,y)

有趣的是, qr.fittedqr.coef似乎沒有占用太多內存,所以這些qr.coef以為我工作而不會耗盡內存。 qr.coef版本似乎稍微快一些。

reslsfit3 <- function(x,y) { y - qr.fitted(qr(x), y) }
reslsfit4 <- function(x,y) { y - A %*% qr.coef(qr(x), y) }

為什么你的y變量有很多列而你的x變量只有一個? 你搞砸了嗎?

lsfit會做得更好嗎,比如通過lsfit()$ residuals? 它仍然使用qr分解,所以它可能沒有幫助。

暫無
暫無

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

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