2017-05-26 143 views
3

我試圖用speedglm實現比glm更快的GLM估計,但爲什麼它更慢?爲什麼`speedglm`比`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 
+0

@李哲源ZheyuanLi感謝您的評論。爲什麼?我閱讀文檔就像$ O(p^2)$ – hxd1011

+1

你應該解釋你的工作環境。如果你想盡可能快地完成許多小GLM(合理的可能性),你可能需要考慮直接使用'glm.fit()'... –

+0

@BenBolker我試圖用300萬行進行Logistic迴歸, 〜1000列,想看看它在不同的包裝中運行速度有多快。 – hxd1011

回答

7

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,更貴!事實上,在這種情況下,矩陣叉積成爲剪切開銷!

+1

詳細FLOP的好幫手! – hxd1011

+0

我可以再問一個問題嗎?如果我想適合說1e8行,1e4列規則邏輯迴歸,我應該去哪個包? – hxd1011