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

标签 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 

最佳答案

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,更昂贵了!实际上,在这种情况下,矩阵叉积变成了剪切开销!

关于r - 为什么 `speedglm`比 `glm`慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44207949/

相关文章:

python - 从 django 的查询集中获取第一个对象的最快方法?

r - 绘图回归线 R

r - 从R中的lm中提取标准化系数

r - 如何调用使用 magrittr 管道创建的对象的元素?

r - 如何在 text(x,y,expression(...)) 中使用多个等号

r - 包含行中出现次数最多的字符串的新列

python - 如何使用 tensorflow 训练简单的非线性回归模型?

css - 有什么方法可以在不丢失颜色的情况下打印 rmarkdown 表吗?

c# - log2(int) 和 log2(float) 的最快实现

java - 如何高效排序一百万个元素?