Есть ли в Python функция для обнаружения особых точек на кривой? - PullRequest
1 голос
/ 27 марта 2019

Мне нужно обнаружить особые точки (экстремумы, изменение тренда, резкие изменения) на заданной кривой, построенной из набора данных. Первое, что нужно иметь в виду, - это обнаружение точки перегиба с выводом (но у меня нет математического выражения построенной кривой), второе - как определить угловые точки. поэтому, если возможно, могу ли я построить (используя python) скользящее окно, которое обнаруживает такого рода SP (особые точки), если возможно, какие библиотеки и функции используются?

Спасибо

Обнаружение особой точки

1 Ответ

0 голосов
/ 27 марта 2019

Я просто очистил некоторые из ваших данных , чтобы показать вам, что вы можете найти точки во всем наборе данных, не используя скользящее окно (но вы могли бы, теоретически):

  1. Локальные экстремумы (найти пики в необработанных данных)
  2. Макс. Крутизна (найти пики в 1-й производной)
  3. Точки перегиба (найти пики во 2-й производной)

Во-первых, давайте посмотрим на вычисление производных:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("Default Dataset.csv", 
                 sep=';', 
                 decimal=",", 
                 header=None)

### Interpolate linearily ###
x_new = np.linspace(0, df[0].iloc[-1], 2000)
y_new = np.interp(x_new, df[0], df[1])

### First and second derivative ###
diff1 = np.insert(np.diff(y_new), 0, 0)
diff2 = np.insert(np.diff(diff1), 0, 0)

### Plot everything ###
plt.figure(figsize=(12,3))
plt.subplot(131)
plt.plot(x_new, y_new)
plt.subplot(132)
plt.plot(x_new, diff1)
plt.subplot(133)
plt.plot(x_new, diff2)
plt.tight_layout()

Здесь я также интерполирую, чтобы получить равный интервал между точками данных.Далее, я вставляю 0 в положение 0, используя функцию np.insert после дифференцирования, чтобы обеспечить ту же форму, что и исходные данные.

Comparison of raw, 1st deriv and 2nd deriv

Далее мы найдем пики:

import peakutils as pu

ix_abs   = pu.indexes(y_new, thres=0.5, min_dist=15)
ix_diff1 = pu.indexes(diff1, thres=0.5, min_dist=15)
ix_diff2 = pu.indexes(diff2, thres=0.5, min_dist=15)

plt.scatter(x_new[ix_abs], y_new[ix_abs], color='g', label='abs')
plt.scatter(x_new[ix_diff1], y_new[ix_diff1], color='r', label='first deriv')
plt.scatter(x_new[ix_diff2], y_new[ix_diff2], color='purple', label='second deriv')

plt.plot(x_new, y_new)
plt.legend(loc='best')

peaks in data

Я использую пакет peakutils , потому чтоэто работает хорошо почти во всех случаях.Вы видите, что не все точки, которые были указаны в вашем примере, были найдены.Вы можете поиграть с различными параметрами для threshold и minimum distance, чтобы найти лучшее решение.Но это должно стать хорошей отправной точкой для дальнейших исследований.Действительно, параметр minimum distance даст вам желаемое скользящее окно .

...