我已经建立了一个卡尔曼滤波函数,它基本上实现了以下功能:
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_oos
as。我想使用估计的卡尔曼滤波器,使用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()
期望我在观察中的输入变量是一个单一的值,如果您提供更多,它会(意外地)对所有其他值产生影响
目前没有回答
相关问题 更多 >
编程相关推荐