Python Pykalman filter.update()批处理vs循环
我已经建立了一个卡尔曼滤波函数,它基本上实现了以下功能:Python Pykalman filter.update()批处理vs循环,python,numpy,kalman-filter,pykalman,Python,Numpy,Kalman Filter,Pykalman,我已经建立了一个卡尔曼滤波函数,它基本上实现了以下功能: import numpy as np from pykalman import KalmanFilter x_is = np.random.randn(100) #In sample data x_oos = np.random.randn(50) #Out of sample data kf = KalmanFilter(transition_matrices = [1], observation_matrices
import numpy as np
from pykalman import KalmanFilter
x_is = np.random.randn(100) #In sample data
x_oos = np.random.randn(50) #Out of sample data
kf = KalmanFilter(transition_matrices = [1],
observation_matrices = [1],
initial_state_mean = 0,
initial_state_covariance = 1,
observation_covariance=1,
transition_covariance=.01)
state_is_means, state_is_covs = kf.filter(x_is)
ism, iscovs = state_is_means.flatten(), state_is_covs.flatten()
#Option2: loop
kf = KalmanFilter(transition_matrices = [1],
observation_matrices = [1],
initial_state_mean = 0,
initial_state_covariance = 1,
observation_covariance=1,
transition_covariance=.01)
state_is_means, state_is_covs = kf.filter(x_is) #Repeating to re-obtain the same KF before update
ism2, iscovs2 = state_is_means.flatten(), state_is_covs.flatten() #Same as ism, iscov
oos2m, oos2cov = np.asarray(state_oos_means).flatten(), np.asarray(state_oos_means.copy().flatten())
prevm, prevc = ism2[-1], ism2[-1]
for idx in range(len(x_oos)):
oos2m[idx], oos2cov[idx] = kf.filter_update(prevm,prevc,x_oos[idx])
prevm, prevc = oos2m[idx], oos2cov[idx]
因此,在sample中使用,过滤器返回状态的均值和协方差(在sample中)
现在:假设样本数据中有xoos
。我想使用估计的卡尔曼滤波器,使用Filter\u update()
更新它
我确信,在循环中使用函数filter\u update()
,我会得到我想要的实际结果(逐步估计状态均值和COV,在每个时间步更新)
但是,我想对一批数据使用filter\u update()。但当我这么做的时候:
oos1m, oos1c = kf.filter_update(ism[-1],iscovs[-1],x_oos)
oos1m, oos1c = oos1m.flatten(), oos1c.flatten()
第一个变量有多个值(状态均值),但协方差只有一个值
此外,针对具有以下内容的循环进行测试:
import numpy as np
from pykalman import KalmanFilter
x_is = np.random.randn(100) #In sample data
x_oos = np.random.randn(50) #Out of sample data
kf = KalmanFilter(transition_matrices = [1],
observation_matrices = [1],
initial_state_mean = 0,
initial_state_covariance = 1,
observation_covariance=1,
transition_covariance=.01)
state_is_means, state_is_covs = kf.filter(x_is)
ism, iscovs = state_is_means.flatten(), state_is_covs.flatten()
#Option2: loop
kf = KalmanFilter(transition_matrices = [1],
observation_matrices = [1],
initial_state_mean = 0,
initial_state_covariance = 1,
observation_covariance=1,
transition_covariance=.01)
state_is_means, state_is_covs = kf.filter(x_is) #Repeating to re-obtain the same KF before update
ism2, iscovs2 = state_is_means.flatten(), state_is_covs.flatten() #Same as ism, iscov
oos2m, oos2cov = np.asarray(state_oos_means).flatten(), np.asarray(state_oos_means.copy().flatten())
prevm, prevc = ism2[-1], ism2[-1]
for idx in range(len(x_oos)):
oos2m[idx], oos2cov[idx] = kf.filter_update(prevm,prevc,x_oos[idx])
prevm, prevc = oos2m[idx], oos2cov[idx]
在oos2m和oos1m中产生不同的结果(第一个值除外)
我错过了什么?我认为oos1m
在某种程度上是错误的(做一些与递归预测不同的事情)。我怀疑filter\u update()
期望观察中的输入变量是单个值,如果您提供更多,它会(意外地)对所有其他值产生影响