Как использовать модель фильтра Калмана для обнаружения пиков - PullRequest
0 голосов
/ 28 декабря 2018

Для моей оценки я хотел использовать библиотеку фильтров PyKalman .Я создал очень маленькие данные временных рядов, готовых с тремя столбцами, отформатированными следующим образом.Полный набор данных прилагается здесь для воспроизводимости, так как я не могу прикрепить файл к stackoverflow:

http://www.mediafire.com/file/el1tkrdun0j2dk4/testdata.csv/file

  time        X      Y
 0.040662  1.041667  1
 0.139757  1.760417  2
 0.144357  1.190104  1
 0.145341  1.047526  1
 0.145401  1.011882  1
 0.148465  1.002970  1
 ....      .....     .

Я прочитал Документация библиотеки PyKalman для Python и удалось сделать простую линейную фильтрацию с использованием Kalman Filter, и вот мой код

import matplotlib.pyplot as plt 
from pykalman import KalmanFilter 
import numpy as np
import pandas as pd



df = pd.read_csv('testdata.csv')
print(df)
pd.set_option('use_inf_as_null', True)

df.dropna(inplace=True)


X = df.drop('Y', axis=1)
y = df['Y']



estimated_value= np.array(X)
real_value = np.array(y)

measurements = np.asarray(estimated_value)



kf = KalmanFilter(n_dim_obs=1, n_dim_state=1, 
                  transition_matrices=[1],
                  observation_matrices=[1],
                  initial_state_mean=measurements[0,1], 
                  initial_state_covariance=1,
                  observation_covariance=5,
                  transition_covariance=1)

state_means, state_covariances = kf.filter(measurements[:,1]) 
state_std = np.sqrt(state_covariances[:,0])
print (state_std)
print (state_means)
print (state_covariances)


fig, ax = plt.subplots()
ax.margins(x=0, y=0.05)

plt.plot(measurements[:,0], measurements[:,1], '-r', label='Real Value Input') 
plt.plot(measurements[:,0], state_means, '-b', label='Kalman-Filter') 
plt.legend(loc='best')
ax.set_xlabel("Time")
ax.set_ylabel("Value")
plt.show()

, который дает следующий график в качестве вывода

enter image description here

Как видно из графика и моего набора данных , мой ввод нелинейный.Поэтому я хотел использовать Kalman Filter и посмотреть, смогу ли я обнаружить и отследить капли отфильтрованного сигнала (синий цвет на приведенном выше графике).Но так как я новичок в Kalman Filter, мне, кажется, трудно понять математическую формулировку и начать работать с Unscented Kalman Filter.Я нашел хороший пример базового использования PyKalman UKF - но он не показывает, как определить процент падения (пиков).Поэтому я был бы признателен за любую помощь, по крайней мере, которая обнаруживает, насколько велика капля от пиков отфильтрованной (например, 50% или 80% от предыдущей капли синей линии на графике).Любая помощь будет оценена.

...