簡體   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