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()
期望观察中的输入变量是单个值,如果您提供更多,它会(意外地)对所有其他值产生影响