2
我已經寫了cumsum
功能,在那裏我將當前值之前乘以衰減因子以前總和的變化:矢量化功能:cumsum有衰減參數
decay <- function(x, decay=0.5){
for (i in 2:length(x)){
x[i] <- x[i] + decay*x[(i-1)]
}
return(x)
}
這裏有一個演示,使用二進制變量做出明確的效果:
set.seed(42)
Events <- sample(0:1, 50, replace=TRUE, prob=c(.7, .3))
plot(decay(Events), type='l')
points(Events)
編譯這個函數其加速了很多:
#Benchmark
library(compiler)
library(rbenchmark)
cumsum_decayCOMP <- cmpfun(cumsum_decay)
Events <- sample(0:1, 10000, replace=TRUE, prob=c(.7, .3))
benchmark(replications=rep(100, 1),
cumsum_decay(Events),
cumsum_decayCOMP(Events),
columns=c('test', 'elapsed', 'replications', 'relative'))
test elapsed replications relative
1 cumsum_decay(Events) 3.28 100 6.979
2 cumsum_decayCOMP(Events) 0.47 100 1.000
但我懷疑矢量化將改善它甚至更多。有任何想法嗎?
那太好了,謝謝! – Zach
小心點。 filter.decay返回一個ts對象。使用as.vector(...)使其與其他兩個函數的結果相同。您可以將as.vector(..)放入函數中。 – Bhas