繁体   English   中英

R中加权最小二乘方协方差矩阵的加速逆

[英]Speed-up inverse of weighted least squares covariance matrix in R

我需要加快R中WLS协方差矩阵的逆的计算速度,其中的矩阵wls.cov.matrix由(下面的完整示例)给出:

n = 10000
X = matrix(c(rnorm(n,1,2), sample(c(1,-1), n, replace = TRUE), rnorm(n,2,0.5)), nrow = 1000, ncol = 3)
Q = diag(rnorm(n, 1.5, 0.3))
wls.cov.matrix = solve(t(X)%*%diag(1/diag(Q))%*%X)

是否可以加快计算速度?

与最终目标非常相关的更多信息:这仍然是很少的信息,让我解释更多我的目标,并且如果有加速我的代码的方法,将会更加清楚。
我运行wls.cov.matrix的次数为1万次,所以我需要它要快得多。

但是,每次运行时,我都使用相同的X,唯一改变的矩阵是Q,它是对角矩阵。

如果X是一个与Q暗淡的方阵,我可以预先计算X^-1(X^T)^(-1)

X.inv = solve(X)
X.inv.trans = solve(t(X))

然后对于每次迭代运行:

Q.inv = diag(1/diag(Q))
wls.cov.matrix = X.inv%*%Q.inv%*%X.inv.trans

但是我的X不是方形的,所以还有其他技巧吗?

Q是对角矩阵,因此它的逆仅由对角项的逆给出。 您可以这样做

X = matrix(c(rnorm(n,1,2), sample(c(1,-1), n, replace = TRUE), rnorm(n,2,0.5)), nrow = 1000, ncol = 3)
Qinv = diag(1/rnorm(n, 1.5, 0.3))
wls.cov.matrix = solve(t(X)%*%Qinv%*%X)

实际上,这可以使事情加速大约20倍。

这里主要的耗时部分是t(X)%*%diag(1/diag(Q))%*%X ,而不是其逆的计算。

一个不错的技巧是将其计算为

crossprod(X / sqrt(diag(Q)));

确认:

all.equal( (t(X) %*% diag(1/diag(Q)) %*% X) , crossprod(X / sqrt(diag(Q))) );

[1] TRUE

要比较计时运行:

Qdiag = diag(Q);
system.time({(t(X) %*% diag(1/Qdiag) %*% X)})
system.time({crossprod(X / sqrt(Qdiag))})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM