如何使用PyKalman获取标准差?

3

我有一维测量数据,希望使用卡尔曼滤波器来确定每个点的状态标准差。我的步骤如下:

from pykalman import KalmanFilter
import numpy as np

measurements = np.asarray([2, 1, 3, 6, 3, 2, 7, 3, 4, 4, 5, 1, 10, 3, 1, 5])
kf = KalmanFilter(transition_matrices=[1],
                  observation_matrices=[1],
                  initial_state_mean=measurements[0],
                  initial_state_covariance=1,
                  observation_covariance=1,
                  transition_covariance=0.01)
state_means, state_covariances = kf.filter(measurements)
state_std = np.sqrt(state_covariances[:,0])
print state_std

这将导致以下奇怪的结果:
[[ 0.70710678]
 [ 0.5811612 ]
 [ 0.50795838]
 [ 0.4597499 ]
 [ 0.42573145]
 [ 0.40067908]
 [ 0.38170166]
 [ 0.36704314]
 [ 0.35556214]
 [ 0.34647811]
 [ 0.33923608]
 [ 0.33342945]
 [ 0.32875331]
 [ 0.32497478]
 [ 0.32191347]
 [ 0.31942809]]

我预计最后的数据点会有增加的方差。我做错了什么吗?

方差没有状态均值是毫无意义的。每个时间步骤它们是什么? - user2717954
状态意味着根据转移协方差正确计算(但我不知道在哪里获取正确的方差值和标准偏差)。 - Joe
你为什么认为方差没有被正确计算? - user2717954
1
标准差的值,根据我的计算,具有渐近特性,尽管测量值朝着末尾增加了波动性。因此,我希望通过卡尔曼来看到它。我认为我没有正确地读取状态协方差矩阵。 - Joe
我猜你需要fork这个包并使用predicted_state_covariances。https://github.com/pykalman/pykalman/blob/master/pykalman/standard.py#L298 - tyao
1个回答

3

由于您提供的所有协方差矩阵(测量、转换)都很小(这意味着您不希望观察到太多的不确定性),因此状态协方差并不反映您的渐近增长观测离散度,因此卡尔曼滤波器输出非常平稳。但是,如果您认为测量、转换等存在更多的不确定性,我认为您可以提供更高的协方差,从而得到KF输出不是很平稳(几乎跟随测量值),但是渐近增加也将反映在KF输出协方差中,如下所示。

from pykalman import KalmanFilter
import numpy as np

measurements = np.asarray([2, 1, 3, 6, 3, 2, 7, 3, 4, 4, 5, 1, 10, 3, 1, 5])
kf = KalmanFilter(transition_matrices=[1],
                  observation_matrices=[1],
                  initial_state_mean=measurements[0],
                  initial_state_covariance=1,
                  observation_covariance=5,
                  transition_covariance=9) #0.01)
state_means, state_covariances = kf.filter(measurements)
state_std = np.sqrt(state_covariances[:,0])
print state_std
print state_means   
print state_covariances
import matplotlib.pyplot as plt
plt.plot(measurements, '-r', label='measurment')
plt.plot(state_means, '-g', label='kalman-filter output')
plt.legend(loc='upper left')
plt.show()

enter image description here

measurement_std = [np.std(measurements[:i]) for i in range(len(measurements))]
plt.plot(measurement_std, '-r', label='measurment std')
plt.plot(state_std, '-g', label='kalman-filter output std')
plt.legend(loc='upper left')
plt.show()

enter image description here


必须有一种方法可以动态跟踪Kalman的测量方差。目前,该值很快饱和,并且不反映波动性的局部增加。因此,我仍然不确定state_std = np.sqrt(state_covariances[:,0])是否是获取当前标准偏差的正确方法。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接