微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 rollapply 函数找到局部最小值?

如何解决如何使用 rollapply 函数找到局部最小值?

this answer 之后,我试图找到函数的局部最小值。这是我正在做的:

require(ggplot2)
require(zoo)

x <- seq(0,25,by=0.1)
y <- sin(x)

my.df <- data.frame(x,y)

xz <- as.zoo(y)
rxz <- zoo::rollapply(xz,width = 20,align = "center",function(x) which.min(x)==2)

indexes <- index(rxz)[coredata(rxz)]
indexes

ggplot(my.df,aes(x,y)) + geom_line() + geom_vline(xintercept = my.df$x[indexes])

绘制结果给出:

enter image description here

我猜 x 偏移是由于我使用的宽度,但无法弄清楚为什么会发生这种情况,因为 rollapply 应该使用居中滚动窗口。

解决方法

两个建议:

  1. 根据@IceCreamToucan 的评论,由于宽度为 20,您将 ==2 用作 1011 可能更合适。

  2. 为了缓解确定 10 或 11 中哪一个更合适的问题(因为您有偶数宽度的内核),我建议使用奇数宽度的内核。

wid <- 21L
ceiling(wid/2)
# [1] 11
rxz <- zoo::rollapply(y,width = 21,align = "center",function(x) which.min(x) == ceiling(wid/2),fill = FALSE)
ggplot(my.df,aes(x,y)) + geom_line() + geom_vline(xintercept = x[rxz])

ggplot2 highlighting local minima

请注意,我有意以编程方式设置宽度,以排除 rollapply 和内部函数调用之间出现不一致的可能性。 (我推断这可能是您遇到的情况:您最初的宽度为 3 或 4,其中 == 2 更有意义。我可能错了,这只是猜测:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。