为什么 `speedglm` 比 `glm` 慢?

Why is `speedglm` slower than `glm`?

我正在尝试使用 speedglm 来实现比 glm 更快的 GLM 估计,但为什么它更慢?

set.seed(0)
n=1e3
p=1e3
x=matrix(runif(n*p),nrow=n)
y=sample(0:1,n,replace = T)

ptm <- proc.time()
fit=glm(y~x,family=binomial())
print(proc.time() - ptm)
#   user  system elapsed 
#  10.71    0.07   10.78 

library(speedglm)
ptm <- proc.time()
fit=speedglm(y~x,family=binomial())
print(proc.time() - ptm)
#   user  system elapsed 
#  15.11    0.12   15.25 

speedglm 优于 glm 的效率是将 n * p 模型矩阵简化为 p * p 矩阵的方式。但是,如果你有n = p,则没有有效减少。您真正想要检查的是 n >> p 案例。


在 Fisher 评分的每次迭代中,从计算复杂性中获得更多见解。

glmn * p 矩阵使用 QR 分解需要 2np^2 - (2/3)p^3 FLOP,而 speedglm 形成 n * p 矩阵的矩阵叉积,然后是p * p 矩阵的 QR 因式分解涉及 np^2 + (4/3)p^3 FLOP。所以n >> pspeedglm的计算量只有glm的一半。此外,speedglm 使用的阻塞、缓存策略可以更好地利用计算机硬件,从而提供高性能。

如果你有 n = p,你会立即看到 glm 失败了 (4/3)p^3,但是 speedglm 失败了 p^3 + (4/3)p^3更贵!事实上,矩阵叉积在这种情况下变成了剪切开销!