如何解决Pykalman filter.update() 批处理 vs 循环
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()
,我会得到我想要的实际结果(状态均值和 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],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()
期望我在观察中的输入变量是单个值,并且如果您提供更多值,它会(意外地)对所有其他值执行某些操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。