【问题标题】:How to find local maximum in R from graph如何从图中找到 R 中的局部最大值
【发布时间】:2019-03-25 16:21:26
【问题描述】:

我的编码有问题。我应该这样做

  1. 绘制此方程 [y=f(x)] 的图,其中 f(x) = (10*((x-1)^2)^(1/3))/(x^2 + 9) 10001 个 x 值在 -5 和 5 之间(包括)

  2. 在a的10001个x值中,找出f(x)的两个局部最大值。

我试过这样做:

# question1
x <- seq(-5,5,length=10001)
y <- (10*((x-1)^2)^(1/3))/(x^2 + 9)

plot(x,y) # This will produce a graph with two max point

# question2
x[which.max(y)]
y[which.max(y)]

但是,我只得到最大点之一的坐标,不知道如何获得另一个最大点。

【问题讨论】:

  • 局部最大值是一个常见的数学问题。并且很难在一般意义上得到 well,尤其是对于基本 R 函数。顺便说一句,请注意发布 实际 R 代码:您的代码有三个错误(// 注释,与 {y) 不匹配的括号,以及在其定义之前使用的 x,因为 Dave2e 已经足够好了查找/修复)。
  • which.max 求全局最大值,所以不能这样。这可能有用:stats.stackexchange.com/questions/22974/…
  • 一种常见的(但肯定不是绝对可靠的)方法是求导数 (diff) 并找到导数与零交叉的所有翻转点(正负)。 (这可能是@yarnabrina 的链接正在做的事情,我没有仔细查看代码。)

标签: r function max local


【解决方案1】:

您可以使用包ggpmisc中的find_peaks

library(ggpmisc)
x[ggpmisc:::find_peaks(df$y)]
y[ggpmisc:::find_peaks(df$y)]

输出是:

[1] -1.5  3.0
[1] 1.6373473 0.8818895

请注意,函数find_peaks 被标记为内部。因此,您需要使用::: 访问它。

您可以使用spanstrict 参数进一步参数化对find_peaks 的调用。详情请见??find_peaks

您也可以使用ggplot2ggpmisc 包直接绘制此图:

x <- seq(-5,5,length=10001)
y <- (10*((x-1)^2)^(1/3))/(x^2 + 9)
df <- data.frame(x = x, y = y)
ggplot(data = df, aes(x = x, y = y)) + geom_line() + stat_peaks(col = "red")

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 2016-03-16
    • 2014-04-08
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2017-01-04
    相关资源
    最近更新 更多