#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. Это классическая проблема. Как говорит Эклз, подгоните кривую с использованием экспоненты, вычислите абсциссу / ординату, для которой у вас есть изменение выпуклости, возьмите точку на исходной кривой, ближайшую к этой абсциссе / ординате.