Минимизация дискретного вектора / массива без знания функции?

#python #vector #difference #derivative

#python #вектор #разница #производная

Вопрос:

Я пытаюсь найти минимум второй производной для элементов в приведенном ниже массиве:

 scores = [-100.07, -40.04, -26.97, -17.31, -13.12, -9.02, -7.22,
     -5.23, -4.37, -3.44, -2.92, -2.36, -2.11, -1.78,
     -1.59, -1.37, -1.23, -1.1 , -0.97, -0.87]
  

Вывод этих данных при k значении 20 приводит к приведенному ниже графику. Я обвел красным «оптимальное» количество кластеров на основе этого показателя оценки.

введите описание изображения здесь

Проблема, однако, в том, что мне пришлось вмешаться вручную (т. Е. Компьютер не выбрал эту точку минимизации). Я бы предпочел, чтобы компьютер выбрал соответствующий k , поэтому я пытаюсь найти точку, в которой вторая производная наименьшая.

Я пробовал различать, например

 import numpy as np
first_diff = np.diff(scores, 1)
second_diff = np.diff(scores, 2)
  

Но это неудовлетворительно, поскольку последовательность вторых различий приводит к некоторым положительным числам, а затем к некоторым отрицательным числам, что не приведет к желаемым результатам при использовании np.argmin . Использование процентных изменений также плохо работает.

Есть ли надежный способ различать эти типы векторов?

Комментарии:

1. Подгонять кривую и использовать ее вторую производную?

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