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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?