Вычислить «колено» для кривой автоматически и математически - PullRequest
18 голосов
/ 17 декабря 2010

Один пример для кривой показан ниже. Точка локтя может быть х = 3 или 4. Как автоматически и математически вычислить колено для кривой?

alt text

Ответы [ 4 ]

12 голосов
/ 17 декабря 2010

Возможно, вы захотите найти точку с максимальной абсолютной второй производной, которая для набора дискретных точек x[i], как у вас, может быть аппроксимирована с центральной разностью:

secondDerivative[i] = x[i+1] + x[i-1] - 2 * x[i]

Как отмечалось выше, вам действительно нужна точка с максимальной кривизной, но подойдет вторая производная, и эта центральная разница является хорошим прокси для второй производной.

9 голосов
/ 13 апреля 2018

Я создал пакет Python , который пытается реализовать алгоритм Kneedle .

Чтобы воссоздать вышеуказанную функцию и определить точку максимальной кривизны:

x = range(1,21)
y = [0.065, 0.039, 0.030, 0.024, 0.023, 0.022, 0.019, 0.0185, 0.0187,
     0.016, 0.015, 0.016, 0.0135, 0.0130, 0.0125, 0.0120, 0.0117, 0.0115, 0.0112, 0.013]

kn = KneeLocator(
    x,
    y,
    curve='convex',
    direction='decreasing',
    interp_method='interp1d',
)

print(kn.knee)
7
import matplotlib.pyplot as plt
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xticks(range(1,21))
plt.plot(x, y, 'bx-')
plt.vlines(kn.knee, plt.ylim()[0], plt.ylim()[1], linestyles='dashed')

enter image description here

обновление
У Kneed есть улучшенный метод подбора сплайнов для обработки локальных минимумов, используйте interp_method='polynomial'.

kn = KneeLocator(
    x,
    y,
    curve='convex',
    direction='decreasing',
    interp_method='polynomial',
)

print(kn.knee)
4

И новый сюжет:

plt.xlabel('x')
plt.ylabel('f(x)')
plt.xticks(range(1,21))
plt.plot(x, y, 'bx-')
plt.vlines(kn.knee, plt.ylim()[0], plt.ylim()[1], linestyles='dashed')

enter image description here

3 голосов
/ 17 декабря 2010

Подобные функции обычно называются L-кривыми для их форм. Они появляются при решении некорректных задач путем регуляризации.

Точка локтя - это точка на кривой с максимальной абсолютной второй производной.

1 голос
/ 17 декабря 2010

Что вам действительно нужно, так это точка с максимальной кривизной . Когда наклон намного меньше 1, его можно аппроксимировать второй производной (как указывает @ebo), но это не всегда так.

...