[英]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.