首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PyKalman获得标准差?

如何使用PyKalman获得标准差?
EN

Stack Overflow用户
提问于 2017-01-22 14:51:56
回答 1查看 719关注 0票数 3

有了一维测量数据,我想知道使用卡尔曼滤波器在每个点上的州标准偏差。我的步骤如下:

代码语言:javascript
复制
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

这导致了以下奇怪的结果:

代码语言:javascript
复制
[[ 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]]

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

EN

回答 1

Stack Overflow用户

发布于 2017-01-22 15:37:51

由于您提供的所有协方差矩阵(测量、转换)都很小(这意味着您不希望观测中有太多不确定性),状态协方差不会反映您渐近增加的观测分散度,因此kalman fitler输出非常平滑。但如果你认为在测量,过渡等方面有更多的不确定性,我认为你可以提供更高的协方差,因此你会得到不太平滑的KF输出(几乎跟随测量),但渐近增加也将反映在KF输出协方差中,如下所示。

代码语言:javascript
复制
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()

代码语言:javascript
复制
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()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41788155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档