我在这里使用了卡尔曼滤波器:https://gist.github.com/alexbw/1867612
我对它有一个非常基本的了解。这是我的测试代码:
import matplotlib.pyplot as plt
import numpy as np
from Kalman import Kalman
n = 50
d = 5
xf = np.zeros(n - d)
yf = np.zeros(n - d)
xp = np.zeros(d)
yp = np.zeros(d)
x = np.zeros(n)
y = np.zeros(n)
for i in range(n):
if i==0:
x[i] = 05
y[i] = 20
KLF = Kalman(6, 2)
elif i< (n - d):
xf[i], yf[i] = KLF.predict()
x[i] = x[i-1] + 1
y[i] = y[i-1] + np.random.random() * 10
NewPoint = np.r_[x[i], y[i]]
KLF.update(NewPoint)
else:
x[i] = x[i-1] + 1
y[i] = y[i-1] + np.random.random() * 10
xp[n - i -1], yp[n - i -1] = KLF.predict()
NewPoint = np.r_[x[i] , yp[n - i -1]]
KLF.update(NewPoint)
plt.figure(1)
plt.plot(x, y, 'ro') #original
plt.plot(xp, yp, 'go-') #predicted kalman
plt.plot(xf, yf, 'b') #kalman filter
plt.legend( ('Original', 'Prediction', 'Filtered') )
plt.show()
我的问题是,如果数据从 x=5, y=20 开始,为什么卡尔曼滤波从 0 开始?
这是某种标准行为吗?
谢谢
最佳答案
卡尔曼实例的当前状态存储在 x
属性中:
In [48]: KLF = Kalman(6, 2)
In [49]: KLF.x
Out[49]:
matrix([[ 0.],
[ 0.],
[ 0.],
[ 0.],
[ 0.],
[ 0.]])
六个分量代表位置、速度和加速度。所以默认情况下,卡尔曼实例从
(0,0)
开始,速度和加速度为零。实例化
KLF
后,当 i=1
时,首先调用 xf
对 yf
和 KLF.predict
进行修改:xf[i], yf[i] = KLF.predict()
这有两个问题。首先,
xf[0], yf[0]
永远不会更新,所以它保持在 (0, 0)
。因此,蓝线从 (0, 0)
开始。第二个问题是,由于卡尔曼类的定义方式,
KLF.x
的当前状态默认为 (0, 0)
。如果您希望
KLF
实例以 (5, 20)
的位置开始,那么您需要自己修改 KLF.x
。还请记住,卡尔曼滤波器旨在首先使用观察进行更新,然后再进行预测。
这在类文档字符串中提到。
现在我不太明白你的代码的意图,所以我不会试图弄清楚
update
s 应该如何出现在 predict
s 之前,但就设置初始状态而言,你可以使用这个:if i==0:
x[i] = 5
y[i] = 20
KLF = Kalman(6, 2)
KLF.x[:2] = np.matrix((x[0], y[0])).T
xf[i], yf[i] = KLF.predict()
这产生
关于python - 卡尔曼滤波器行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25581263/