我正在尝试使用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计分的每次迭代中,从计算复杂性上获得更多洞察力。
对glm
矩阵使用QR分解的n * p
需使用2np^2 - (2/3)p^3
FLOP,而speedglm
形成n * p
矩阵的叉积的叉积,然后对p * p
矩阵进行QR分解,则涉及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,更昂贵了!实际上,在这种情况下,矩阵叉积变成了剪切开销!