【问题标题】:How to get standard deviation using PyKalman?如何使用 PyKalman 获得标准差?
【发布时间】:2017-06-06 21:19:58
【问题描述】:

拥有一维测量数据,我想知道使用卡尔曼滤波器在每个点的状态标准偏差。我的程序如下:

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]]

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

【问题讨论】:

  • 如果没有 state_means,方差就毫无意义。每个时间步的它们是什么?
  • 状态均值计算正确(取决于转移协方差)。但我不知道从哪里得到正确的方差值和标准差。
  • 是什么让您认为方差计算不正确?
  • 标准偏差的值,正如我计算的那样,具有渐近特征,尽管测量值在接近尾声时增加了波动性。所以我希望和卡尔曼一起看。我认为我没有正确读取状态协方差矩阵
  • 我猜你需要分叉包并使用predicted_state_covariancesgithub.com/pykalman/pykalman/blob/master/pykalman/…

标签: python pykalman


【解决方案1】:

由于您提供的所有协方差矩阵(测量、转换)都很小(这意味着您不会期望观察中有那么多不确定性),因此状态协方差不能反映您的观察离散度逐渐增加,因此kalman fitler 输出非常平滑。但是,如果您认为测量、转换等存在更多不确定性,我认为您可以提供更高的协方差,结果您将获得 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()

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

【讨论】:

  • 必须有办法使用卡尔曼动态跟踪测量方差。目前,该值很快就饱和了,并不反映波动性的局部增加。所以我仍然不确定 state_std = np.sqrt(state_covariances[:,0]) 是否是获取当前标准差的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2019-08-16
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2010-11-27
相关资源
最近更新 更多