Pykalman filter.update()批处理vs循环

2024-09-27 00:21:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经建立了一个卡尔曼滤波函数,它基本上实现了以下功能:

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

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

现在:假设样本数据中有x_oosas。我想使用估计的卡尔曼滤波器,使用filter_update()更新它

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

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


Tags: sampleisnpupdatefiltermeansstatetransition

热门问题