簡體   English   中英

R 索引,矩陣乘法

[英]R Indexing, Matrix multiplication

在 R 中使用矩陣的子集時,我似乎對內存使用有誤解。 我在嘗試編寫交叉驗證函數時遇到過,但我認為問題更普遍。 我在下面編寫了一個小例子。

# parameters
n <- 1e6 # the real data are much bigger, but this will do
m <- 50
nfolds <- 10
X <- matrix(rnorm(n*m,0,1),nrow=n,ncol=m)
y <- rnorm(n,0,1)
mse <- rep(0,nfolds)
foldid <- sample(rep(seq(nfolds), length = n))

# produces big spikes in memory
for (i in (1:nfolds)) {
  which <- foldid == i
  xpx <- crossprod(X[!which,])
  xpy <- crossprod(X[!which,],y[!which])
  b <- solve(xpx,xpy)
  mse[i] <- mean((y[which] - X[which,] %*% b)**2)
}

# does not produce spikes in memory usage
for (i in (1:nfolds)) {
  xpx <- crossprod(X)
  xpy <- crossprod(X,y)
  b <- solve(xpx,xpy)
  mse[i] <- mean((y - X %*% b)**2)
}

我不明白為什么第一個循環會在內存使用中產生大的上升峰值,而第二個循環卻沒有,盡管乘以一個嚴格的更大的矩陣。

讓我們將第一行與循環進行比較。

首先,簡單的crossprod

xpx <- crossprod(X)

如果沒有子集,您可以使用矩陣X (已經存在 400 MB)和xpx (小)。

其次,使用子集:

xpx <- crossprod(X[!which,])

在這里,您使用X 、臨時矩陣X[!which,]xpx 額外的矩陣X[!which,]需要額外的 360 MB 內存。

object.size(X[!which,])
# 360000200 bytes

R 的內存管理相對較差,因此臨時矩陣可能在一段時間內不會被丟棄。

暫無
暫無

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

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