Фильтрация Калмана_одномерный_Python

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

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


person Khalid    schedule 07.05.2018    source источник
comment
Так в чем твой вопрос? Также покажите код.   -  person miindlek    schedule 07.05.2018
comment
Я хочу удалить шум из своих данных с помощью фильтрации Калмана с помощью python. Мой вопрос заключается в том, как применить фильтрацию Калмана к моим данным с помощью python. Я следую кодам из указанной ссылки: stackoverflow.com/questions/43377626/ . Я не могу получить никаких результатов. Во-первых, я не могу установить pykalman. Во-вторых, у меня огромное количество строк. Я не могу включать значения по одному.   -  person Khalid    schedule 07.05.2018
comment
Значит, у вас вообще нет кода на Python?   -  person miindlek    schedule 07.05.2018
comment
У меня есть. Как я уже сказал, я использую код из упомянутого вопроса. В своем вопросе я объяснил, что пытаюсь использовать pykalman и получаю неверный синтаксис. Если у меня нет кода, как я могу получить эту ошибку?   -  person Khalid    schedule 07.05.2018
comment
Итак, если у вас есть код, почему вы не можете его опубликовать?   -  person miindlek    schedule 07.05.2018
comment
Я добавил это к вопросу.   -  person Khalid    schedule 07.05.2018


Ответы (1)


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

pip install pykalman --user

Флаг --user устанавливается в мой домашний каталог, избегая использования sudo для установки. Мне сказали, что scipy отсутствует, поэтому я установил и его. На странице проекта на 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

person Oppy    schedule 08.05.2018