这里只是一个想法,从不同的角度来看,可能是一个非常糟糕的想法,但由于差异化并没有起作用,类似这样的东西可能会是一个思路。
首先,您需要确定最小的有意义的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) 为正数的点都是局部极小值/极大值的候选点。根据您得到的结果,您可以开始增加或减少 m。您可以通过类似于二分搜索的方式来实现:如果您想要更多的点,请将 m = (min + m) / 2,如果您想要更少的点,请将 m = (max + m) / 2(相应地调整 min 和 max)。
因此,这里有一个我建议的示例。假设我们有以下系列:
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]
实际上,这似乎相当有效。欢迎分享想法。请注意,这可能是平均值定理的等价物。