Я пытаюсь реализовать простое приложение фильтра Калмана с использованием Pykalman
, но получаю сообщение об ошибке на шаге оценки алгоритма EM, который поставляется с пакетом Pykalman
.
Это простая линейная регрессия с изменяющимся во времени коэффициентом, основанная на смоделированных данных. Код ниже имитирует данные и запускает фильтр Калмана, но когда я пытаюсь оценить параметры на основе наблюдений, используя kf.em(Data)
, он возвращает ошибку: ValueError: object arrays are not supported
.
Я делаю что-то не так с pykalman
?
Модель и полный код ниже. Ошибка возникает в последней строке кода.
Модель (маленькие изображения)
представление модели в пространстве состояний
Полный код
import pandas as pd
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
import pylab as pl
from pykalman import KalmanFilter
# generates the data
Data = pd.DataFrame(columns=['NoiseAR','NoiseReg', 'x', 'beta', 'y'], index=range(1000))
Data['NoiseAR'] = np.random.normal(loc=0.0, scale=1.0, size=1000)
Data['NoiseReg'] = np.random.normal(loc=0.0, scale=1.0, size=1000)
for i in range(1000):
if i==0:
Data.loc[i, 'x'] = Data.loc[i, 'NoiseAR']
else:
Data.loc[i, 'x'] = 0.95*Data.loc[i-1, 'x'] + Data.loc[i, 'NoiseAR']
for i in range(1000):
Data.loc[i, 'beta'] = np.sin(np.radians(i))
Data['y'] = Data['x']*Data['beta'] + Data['NoiseReg']
# set up the kalman filter
F = [1.]
H = Data['x'].values.reshape(1000,1,1)
Q = [2.]
R = [2.]
init_state_mean = [0.]
init_state_cov = [2.]
kf = KalmanFilter(
transition_matrices=F,
observation_matrices=H,
transition_covariance=Q,
observation_covariance=R,
initial_state_mean=init_state_mean,
initial_state_covariance=init_state_cov,
em_vars=['transition_covariance', 'observation_covariance', 'initial_state_mean', 'initial_state_covariance']
)
# estimate the parameters from em_vars using the EM algorithm
kf = kf.em(Data['y'].values)