我注意到了base::chol()
当矩阵包含许多小元素时,速度会严重减慢。这是一个例子:
## disable openMP
library(RhpcBLASctl); blas_set_num_threads(1); omp_set_num_threads(1)
-
Baseline:创建正定矩阵并获取时间chol()
.
loc <- expand.grid(1:60, 1:50)
covmat1 <- exp(-as.matrix(dist(loc)))
mean(c(covmat1))
# [1] 0.002076862
system.time(chol1 <- chol(covmat1))
# user system elapsed
# 0.313 0.024 0.337
-
增加小值: 创造covmat2
具有更多小值的矩阵。
covmat2 <- exp(-as.matrix(dist(loc))*10)
mean(c(covmat2))
# [1] 0.0003333937
system.time(chol2 <- chol(covmat2))
# user system elapsed
# 2.311 0.021 2.333
与基线相比计算速度减慢近 10 倍.
-
将小值设置为零:设定值covmat2
小于 1e-13 到零。
covmat3 <- covmat2
covmat3[covmat3 < 1e-13] <- 0
mean(c(covmat3))
# [1] 0.0003333937
system.time(chol3 <- chol(covmat3))
# user system elapsed
# 0.302 0.016 0.318
该版本再次更快并且与基线相似。
为什么会出现这种放缓的情况?
Notes:
对计时实验的重复评估会得出类似的结果。
我知道对于许多值接近于零的矩阵,使用稀疏矩阵方法可能更有效,例如 R 包spam
.
sessionInfo()
## R version 3.6.1 (2019-07-05)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Linux Mint 19.2
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
## LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)