【问题标题】:Vectorizing a function: cumsum with a decay parameter向量化函数:带有衰减参数的 cumsum
【发布时间】:2012-11-02 18:42:11
【问题描述】:

我编写了 cumsum 函数的变体,在添加当前值之前,我将之前的总和乘以衰减因子:

decay <- function(x, decay=0.5){
  for (i in 2:length(x)){
    x[i] <- x[i] + decay*x[(i-1)]
  }
  return(x)
}

这里是一个demo,使用二进制变量来说明效果:

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

但我怀疑矢量化会进一步改善它。有什么想法吗?

【问题讨论】:

    标签: r vectorization cumsum


    【解决方案1】:

    试试filter函数:

    filter.decay <- function(x, decay=0.5) filter(x, decay, method = "recursive")
    

    速度很快:

    #                       test elapsed replications relative
    # 1     cumsum_decay(Events)    4.83          100    19.32
    # 2 cumsum_decayCOMP(Events)    1.00          100     4.00
    # 3     filter.decay(Events)    0.25          100     1.00
    

    【讨论】:

    • 小心。 filter.decay 返回一个 ts 对象。使用 as.vector(...) 使其与其他两个函数的结果相同。你可以把 as.vector(..) 放在函数里面。
    猜你喜欢
    • 2015-05-09
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多