在numpy的一维数组中寻找拐点和稳定点

4
假设我有以下numpy数组:
import numpy as np
import matplotlib.pyplot as plt
x = np.array([11.53333333, 11.86666667, 11.1, 10.66666667, 11.2, 11.3,
              11.06666667, 12.06666667, 11.8, 13.03333333, 12.4,
              12.33333333, 12.53333333, 13.33333333, 12.43333333, 13., 13.2,
              13.76666667, 14.96666667, 19.16666667, 25.1, 32.,
              83.33333333, 103.76666667, 110.7, 118.63333333, 129.26666667,
              139.06666667, 150.3, 161.53333333, 171.16666667, 184.56666667,
              196.6, 210.26666667, 221.63333333, 231.3, 244.16666667,
              253.5, 254.66666667, 255., 255., 255., 255.,
              255., 255., 255., 255., 255., 255.,
              255., 255., 255., 255., 255., 255.,
              255., 255., 255., 255., 255.])

plt.plot(x)
plt.show()

这是绘制的输出结果:

plotted x

我该如何轻松获取此图中的转折点?例如,第一个转折点大约在x=20处,另一个在x=37处。
是否可以按降序获取所有转折点,以便我之后可以获取最显著的3个转折点?

更新: 我对获取拐点驻点很感兴趣。在numpy / scipy中是否有简单的解决方案?


你可以尝试从你拥有的数据中近似一些导数函数。 - SylvainD
1
定义“拐点”。请用数学方式定义,而不是使用“曲线转弯”的方式。 - Ffisegydd
1
我的猜测是,“转折点”应该是指“拐点”。(从德语翻译错误了吗?) - Sven Marnach
1
我稍微更新了一下文章。根据维基百科上的“拐点”词条,它们也描述了一个“转折点”(请参见此图像)。 - Mirko
2个回答

2

我也在寻找这个答案。以下是一种在Python中寻找拐点的方法:

如何在嘈杂的曲线中找到拐点?

拐点是[x0,y0]

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import gaussian_filter


def generate_fake_data():
    """Generate data that looks like an example given."""
    xs = np.arange(0, 25, 0.05)
    ys = - 20 * 1./(1 + np.exp(-(xs - 5.)/0.3))
    m = xs > 7.
    ys[m] = -20.*np.exp(-(xs - 7.)[m] / 5.)

    # add noise
    ys += np.random.normal(0, 0.2, xs.size)
    return xs, ys


def main():
    xs, ys = generate_fake_data()

    # smooth out noise
    smoothed = gaussian_filter(ys, 3.)

    # find the point where the signal goes above the background noise
    # level (assumed to be zero here).
    base = 0.
    std = (ys[xs < 3] - base).std()
    m = smoothed < (base - 3. * std)
    x0 = xs[m][0]
    y0 = ys[m][0]

    plt.plot(xs, ys, '.')
    plt.plot(xs, smoothed, '-')
    plt.plot(x0, y0, 'o')
    plt.show()


if __name__ == '__main__':
    main()

Python中如何找到拐点的示例输出


2
有许多可能的答案 - 取决于您实际想要什么。一个想法是通过采取移动平均线或样条等方式来平滑数据,然后取二阶导数并寻找何时更改符号。这将找到近似的“拐点”或“转折点” - 字面上,它将找到凹度何时变化。
请参见:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接