Кальман Фильтрация_1-мерный_Питон - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь использовать фильтрацию Калмана для моих одномерных данных. Итак, предположим, что у меня есть следующий набор данных:

 Variable
 250.1
 248.5
 262.3
 265.3
 270.2

Я знаю, что в моих данных присутствует шум, и поэтому я хочу очистить эти данные с помощью фильтрации Калмана . Какой способ может дать наиболее эффективный результат для меня?

Я запускаю следующий код:

 from pykalman import KalmanFilter
 import numpy as np
 kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], 
 observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
 measurements = np.asarray([(250.1),(248.5),(262.3),(265.3), (270.2)])
 kf = kf.em(measurements, n_iter=5)
 (filtered_state_means, filtered_state_covariances)=kf.filter(measurements)
 (smoothed_state_means, smoothed_state_covariances)=kf.smooth(measurements)

Как видите, я пытаюсь использовать pykalman , однако я не могу установить этот модуль. Я пытаюсь использовать направление easy_install pykalman , и ошибка: неверный синтаксис . Другая проблема заключается в том, что у меня огромный набор данных, поэтому в моем столбце переменных содержится более ста тысяч строк. Поэтому я не могу написать все наблюдения по одному.

1 Ответ

0 голосов
/ 08 мая 2018

Для установки pykalman я использовал:

pip install pykalman --user

Флаг --user устанавливается в мой домашний каталог, избегая необходимости использовать sudo для установки. Мне сказали, что Сципи отсутствует, поэтому я установил и Пипа. На странице github проекта есть список зависимых библиотек, поэтому вас могут попросить установить любую из них.

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

%matplotlib inline
from pykalman import KalmanFilter
import numpy as np
kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], 
 observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
# measurements = np.asarray([(250.1),(248.5),(262.3),(265.3), (270.2)])
measurements = np.array([[250.1,1],[248.5,1],[262.3,1],[265.3,1], [270.2,1]])
kf = kf.em(measurements, n_iter=5)
filtered_state_estimates = kf.filter(measurements)[0]
(smoothed_state_estimates, smoothed_state_covariances)=kf.smooth(measurements)
# draw estimates
pl.figure()
lines_true = pl.plot(measurements, color='b')
lines_filt = pl.plot(filtered_state_estimates, color='r')
lines_smooth = pl.plot(smoothed_state_estimates, color='g')
pl.legend((lines_true[0], lines_filt[0], lines_smooth[0]),
          ('true', 'filt', 'smooth'),
          loc='lower right'
)
pl.show()

Для предлагаемого набора данных быстрым и простым способом создания отфильтрованного вывода будет использование альфа-фильтра с одним минусом. Посмотрите на эту ссылку для более подробной информации об этом типе фильтра: http://stats.stackexchange.com/questions/44650/a-simpler-way-to-calculate-exponentially-weighted-moving-average

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...