0

我已经建立了一个卡尔曼滤波器函数,它基本上执行以下操作:

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()

因此,在样本中使用,过滤器返回状态的均值和协方差(在样本中)。

现在:假设我x_oos的样本数据不足。我想使用估计的卡尔曼滤波器,使用filter_update().

我确信,filter_update()在循环中使用该函数,我会得到我想要的实际结果(逐步估计状态均值和 covs,在每个时间步更新)。

但是,我想filter_update()在一批数据上使用,这可能会更快,而且无论如何都会节省代码。但是当我这样做时:

oos1m, oos1c = kf.filter_update(ism[-1],iscovs[-1],x_oos)
oos1m, oos1c = oos1m.flatten(), oos1c.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_update()我的输入变量在观察中是一个单一的值,如果你提供更多的值,它会(出乎意料地)对所有其他值产生影响。

4

0 回答 0