这只是一个想法,有点不同角度的想法,可能是一个非常糟糕的想法,但由于差异化不起作用,这样的事情可能是一个想法。
首先,您需要确定最小有意义的 X 轴间隔。在你的图中,如果你把它看得太小,你会从颠簸中得到误报。这在概念上类似于平滑数据的想法。将此区间称为 dx。
接下来,使用大小为 dx 的滑动窗口,生成与您的曲线对应的移动平均曲线。有很多不同的方法可以考虑这样做(删除统计异常值,或者在窗口中使用更多或更少的点)。将此曲线称为 g(x),并将原始曲线称为 f(x)。此外,制作一条曲线 h(x),它可以测量用于计算 g(x) 的滑动窗口中数据的可变性(如果您使用间隔中的几个点,标准偏差应该可以正常工作)。
现在,开始计算 c_m(x) = |f(x) - g(x)| 形式的曲线。- m * h(x)。您可以从 m = 1 开始。任何 c_m(x) 为正的点 x 都是局部最小值/最大值的候选者。根据您获得的点击次数,您可以开始增加或减少 m。你可以用类似于二分搜索的方式来做:如果你想要更多的点,让 m = (min + m) / 2,如果你想要更少的点,让 m = (max + m) / 2(调整 min 和最大相应)。
所以这是我建议的一个例子。假设我们有以下系列:
f(x) = [ 1, 2, 4, 3, 2, 3, 6, 7, 8, 7,
5, 4, 3, 2, 2, 3, 2, 3, 5, 8, 9]
我们选择 dx = 5。我们通过对 x 周围的点进行简单平均来构造 g(x):
g(x) = [2.3, 2.5, 2.4, 2.8, 3.6, 4.2, 5.2, 6.2, 6.6, 6.2,
5.4, 4.2, 3.2, 2.8, 2.4, 2.4, 3.0, 4.2, 5.4, 6.3, 7.3]
h(x) = [1.2, 1.1, 1.0, 0.7, 1.4, 2.4, 2.3, 1.7, 1.0, 1.5,
1.9, 1.7, 1.2, 0.7, 0.5, 0.6, 1.1, 2.1, 2.7, 2.4, 1.7]
在 m = 1 时,我们得到:
c(x) = [0.1, xxx, 0.6, xxx, 0.2, xxx, xxx, xxx, 0.4, xxx,
xxx, xxx, xxx, 0.1, xxx, 0.0, xxx, xxx, xxx, xxx, 0.0]
实际上,这似乎工作得很好。随意分享想法。请注意,考虑到平均值定理,这可能或多或少等同于微分。