2013-08-07 4 views
6

मुझे नियमित रूप से समय श्रृंखला (विशेष रूप से साधन) की रोलिंग चीजें मिलती हैं, और यह जानकर आश्चर्य हुआ कि rollmeanrollapply से काफी तेज़ है, और align = 'right' विधियां rollmeanr रैपर से तेज हैं।रोलमेली (कोड-वार) से रोलमैन को तेज़ी से क्या बनाता है?

उन्होंने इस गति को कैसे हासिल किया है? और rollmeanr() रैपर का उपयोग करते समय इनमें से कुछ क्यों खो देते हैं?

कुछ पृष्ठभूमि: मैं rollapplyr(x, n, function(X) mean(X)) का उपयोग कर रहा था, हालांकि हाल ही में मैंने कुछ उदाहरणों पर rollmean का उपयोग किया था। दस्तावेज rollapplyr(x, n, mean) (function तर्क के भाग के बिना नोट) rollmean का उपयोग करते हैं, इसलिए मुझे नहीं लगता कि प्रदर्शन में बहुत अंतर आएगा, हालांकि rbenchmark उल्लेखनीय मतभेदों का खुलासा किया।

require(zoo) 
require(rbenchmark) 

x <- rnorm(1e4) 
r1 <- function() rollapplyr(x, 3, mean) # uses rollmean 
r2 <- function() rollapplyr(x, 3, function(x) mean(x)) 
r3 <- function() rollmean(x, 3, na.pad = TRUE, align = 'right') 
r4 <- function() rollmeanr(x, 3, align = "right") 

bb <- benchmark(r1(), r2(), r3(), r4(), 
      columns = c('test', 'elapsed', 'relative'), 
      replications = 100, 
      order = 'elapsed') 

print(bb) 

मैं खोजने के लिए कि rollmean(x, n, align = 'right') विशेष रूप से तेजी से था हैरान था - और मेरे rollapply(x, n, function(X) mean(X)) दृष्टिकोण से ~ 40x तेजी से।

test elapsed relative 
3 r3() 0.74 1.000 
4 r4() 0.86 1.162 
1 r1() 0.98 1.324 
2 r2() 27.53 37.203 

अंतर-डेटा के आकार के आकार के रूप में अंतर बड़ा लगता है। मैंने उपर्युक्त कोड में केवल x (rnorm(1e5)) का आकार बदल दिया और परीक्षण को फिर से चलाया और कार्यों के बीच एक बड़ा अंतर भी था।

test elapsed relative 
3 r3() 13.33 1.000 
4 r4() 17.43 1.308 
1 r1() 19.83 1.488 
2 r2() 279.47 20.965 

और x <- rnorm(1e6)

test elapsed relative 
3 r3() 44.23 1.000 
4 r4() 54.30 1.228 
1 r1() 65.30 1.476 
2 r2() 2473.35 55.920 

कैसे के लिए वे इस किया है? इसके अलावा, क्या यह इष्टतम समाधान है? निश्चित रूप से, यह तेज़ है लेकिन क्या ऐसा करने के लिए भी तेज तरीका है?

: - क्योंकि पहले एक गणना करने के लिए आसान है (ध्यान दें सामान्य रूप में अपने समय श्रृंखला लगभग हमेशा xts वस्तुओं रहे हैं इस फर्क पड़ता है?)

+2

आप 'बहुत तेजी के लिए' caTools' से runmean' प्रयास कर सकते हैं परिणाम – eddi

+2

@DWIN मैं मदद पेज पढ़ें था। मैंने आपके द्वारा उद्धृत पाठ को 'रोलप्लेयर' में उद्धृत किया है लेकिन यह क्यों नहीं समझाता है। इसके बाद मैं 'रोलमेन' गया और पाया "ये कार्य क्रमशः रोलिंग का मतलब है, अधिकतम और औसत क्रमशः और 'रोलप्ली' के समान हैं लेकिन गति के लिए अनुकूलित हैं" ... जो कि क्यों नहीं समझाता है। इसके अतिरिक्त, न तो बताता है कि 'रोलमेन (एक्स, एन, एलाइन =' दाएं ') 'रोलमेनर (एक्स, एन)' से तेज क्यों है। अंत में, इनमें से कोई भी बताता है कि डेटा के आकार के साथ प्रदर्शन अंतराल क्यों बढ़ता है। – ricardo

+0

"क्यों" के लिए पर्याप्त स्पष्टीकरण का गठन करता है? जवाब की "गति की आवश्यकता" कैसे नहीं है? –

उत्तर

7

रोलिंग मतलब एक सामान्य रोलिंग समारोह कंप्यूटिंग की तुलना में तेजी है कम्प्यूटिंग,। एक सामान्य रोलिंग समारोह गणना करते समय, आप फिर से और फिर प्रत्येक विंडो पर समारोह की गणना करने के लिए है, जो आप सरल पहचान की वजह से, mean के लिए क्या करने की जरूरत नहीं है:

(a2 + a3 + ... + an)/(n-1) = (a1 + a2 + ... + a(n-1))/(n-1) + (an - a1)/(n-1) 

और आप देख सकते हैं कि कैसे फायदा उठाया है getAnywhere(rollmean.zoo) पर देखकर।

यदि आप एक तेज़ रोलिंग माध्य चाहते हैं, तो से उपयोग करें, जिसे सी में इसे बहुत तेज बनाने में लागू किया गया है (यह भी बहुत बेहतर है, इसलिए डेटा के आकार के आकार के रूप में भी तेज़ हो जाएगा)।

library(microbenchmark) 
library(caTools) 
library(zoo) 

x = rnorm(1e4) 
microbenchmark(runmean(x, 3, endrule = 'trim', align = 'right'), 
       rollmean(x, 3, align = 'right')) 
#Unit: microseconds 
#            expr  min  lq  median  uq  max neval 
# runmean(x, 3, endrule = "trim", align = "right") 631.061 740.0775 847.5915 1020.048 1652.109 100 
#     rollmean(x, 3, align = "right") 7308.947 9155.7155 10627.0210 12760.439 16919.092 100 
+0

'टीटीआर :: रनमेन' भी है, जो एक्सटीएस ऑब्जेक्ट्स के साथ अच्छी तरह से काम करता है। –

संबंधित मुद्दे