【问题标题】:Why is `speedglm` slower than `glm`?为什么`speedglm`比`glm`慢?
【发布时间】:2017-05-26 18:21:35
【问题描述】:

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

【问题讨论】:

  • 你应该解释你工作的环境。如果您想尽可能快地进行许多小型 GLM 拟合(合理的可能性),您可能需要考虑直接使用 glm.fit() ...
  • @BenBolker 我正在尝试用 300 万行和约 1000 列拟合逻辑回归,想看看它在不同包中的运行速度有多快。

标签: r performance regression glm speedglm


【解决方案1】:

speedglm 优于glm 的效率在于它将n * pmodel 矩阵简化为p * p 矩阵。但是,如果您有n = p,则没有有效的减少。您真正要检查的是 n &gt;&gt; p 案例。


在 Fisher 评分的每次迭代中,更深入地了解计算复杂性。

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

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

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 2019-12-18
    • 2015-10-04
    • 2012-09-16
    • 2016-10-06
    • 2020-11-27
    • 2011-10-19
    • 2020-12-24
    • 2010-11-05
    相关资源
    最近更新 更多