gpt4 book ai didi

r - 使用自定义函数加速 rollapply 的技巧 (r)

转载 作者:行者123 更新时间:2023-12-02 16:59:58 25 4
gpt4 key购买 nike

我有一个 rollapply 函数,它可以做一些非常简单的事情,但是超过百万个数据点这个简单的函数非常慢。我想知道是否可以向 rollapply 提供有关如何进行下一次转换的信息,而不是定义函数本身。

具体来说,我正在为基本统计异常检测执行滚动窗口。

滚动应用功能:

minmax <- function(x) { max(x) - min(x) }

调用者:

mclapply(data[,eval(vars),with=F], 
function(x) rollapply(x,width=winSize,FUN=minmax,fill=NA),
mc.cores=8)

其中 data 是一个 8 列的 data.table,winsize 是 300

此调用在 8 个内核上大约需要 2 分钟。它是整体计算的主要瓶颈之一。但是我可以想象我们可以让它们排序(按值和索引),然后在每次滑动时进行 Olog(n) 比较。

但是我经常看到帖子建议放弃 for 循环并使用 lapply。进一步优化的下一个合乎逻辑的步骤是什么?

最佳答案

不确定这是否/如何适用于 mclapply 环境,但您可以通过使用 zoo 的优化 rollmax 获得一点加速> 功能。由于它们没有互补的 rollmin,因此您需要进行调整。

minmax <- function(x) max(x) - min(x)
aa <- runif(1e4)
identical(
zoo::rollapply(aa, width=100, FUN=minmax, fill=NA),
zoo::rollmax(aa, k=100, fill=NA) + zoo::rollmax(-aa, k=100, fill=NA)
)
# [1] TRUE

microbenchmark::microbenchmark(
minmax = zoo::rollapply(aa, width=100, FUN=minmax, fill=NA),
dblmax = zoo::rollmax(aa, k=100, fill=NA) + zoo::rollmax(-aa, k=100, fill=NA)
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# minmax 70.7426 76.0469 84.81481 77.99565 81.8047 148.8431 100
# dblmax 15.6755 17.4501 19.09820 17.93665 18.8650 52.4849 100

(改进将取决于窗口大小,因此您的结果可能会有所不同,但我认为使用优化函数 zoo::rollmax 几乎总是优于每次调用 UDF。)

关于r - 使用自定义函数加速 rollapply 的技巧 (r),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com