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

时间:2017-05-26 18:21:36

标签: r performance regression glm speedglm

我正在尝试使用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 

1 个答案:

答案 0 :(得分:12)

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

在Fisher评分的每次迭代中,更多的洞察力形成计算复杂性。

glm矩阵使用QR分解的

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

如果您有n = p,则会立即看到glm需要(4/3)p^3 FLOP,但speedglm需要p^3 + (4/3)p^3 FLOP,更贵!事实上,在这种情况下,矩阵交叉乘积成为剪切开销!