为什么 `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 评分的每次迭代中,从计算复杂性中获得更多见解。
glm
对 n * p
矩阵使用 QR 分解需要 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
,但是 speedglm
失败了 p^3 + (4/3)p^3
,更贵!事实上,矩阵叉积在这种情况下变成了剪切开销!
我正在尝试使用 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
对 n * p
矩阵使用 QR 分解需要 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
,但是 speedglm
失败了 p^3 + (4/3)p^3
,更贵!事实上,矩阵叉积在这种情况下变成了剪切开销!