Как оценить гладкость (плоскостность) кривой в python?

#python #scipy

Вопрос:

Мне интересно, как оценить плавность кривой, если есть функция оценки, которую можно описать, или рейтинг можно сравнить с другими.

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

Вот пример моей мысли: График 1
График 2(Смотрите только зеленую линию) оценка или скорость зеленой линии на первом рисунке должны быть выше, так как она выглядит более плавно, чем на втором.

Я думаю о том, могу ли я использовать модуль сигнализации Scipy или что-то еще. Пожалуйста, прокомментируйте мне, если у вас есть какие-либо идеи, это мне очень поможет. Огромное спасибо.

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

1. Не могли бы вы вместо этого рассчитать стандартное отклонение производной от линий?

2. @TomMcLean Но мои данные дискретны, может ли он выполнять вывод на python?

3. Хорошей альтернативой был бы расчет кривизны: delftstack.com/howto/numpy/curvature-formula-numpy . 0 кривизна означает, что это прямая линия

4. @tangerine0803 Да, вы все еще можете рассчитать производную от дискретных данных. видишь np.diff numpy.org/doc/stable/reference/generated/numpy.diff.html (Или в ответе ниже)

Ответ №1:

Существует много различных определений понятия «гладкость». В зависимости от того, что вы ищете, вы можете использовать различные методы для оценки плавности вашей кривой.

Как предположил Том, вы могли бы оценить стандартное отклонение производной.

Другим, более математически точным методом было бы вычисление интеграла от квадрата второй производной вашей функции. Подробнее читайте в этом ответе.

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

В любом случае, чтобы оценить производную от дискретного набора данных, вы можете рассчитать наклон между каждыми двумя точками в вашем наборе данных. Таким образом, это выглядело бы примерно так:

 from numpy import diff

y_dataset = [...]
x_dataset = [...]
dy_dx = diff(y_dataset)/diff(x_dataset)
 

или

 from numpy import diff

y_dataset = [...]
dx = n
dy_dx = diff(y_dataset)/dx
 

Надеюсь, это немного поможет 🙂

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

1. Спасибо за ваш любезный ответ, вы действительно мне помогли 🙂 Сейчас я пытаюсь с помощью предложения Тома и вашего предложения рассчитать наклон. Математически, как вы упомянули, я все еще не совсем понимаю после проверки ссылки, но, возможно, я попытаюсь закодировать их с помощью формулы.