我正在尝试执行以下代码
p, c = [], []
for z in mes:
print (z)
print (c)
print (p)
p.append(kf.x)
c.append(kf.P)
kf.predict()
kf.update(z) #error on this line
我得到错误:
ValueError:尺寸不匹配:数组“ cov”的形状为(1,1),但是
“均值”是长度为2的向量。
这是屏幕上显示的输出
[512 102]
[array([[ 1000., 0., 0., 0.],
[ 0., 1000., 0., 0.],
[ 0., 0., 1000., 0.],
[ 0., 0., 0., 1000.]])]
[array([[ 396.],
[ 187.],
[ 0.],
[ 0.]])]
如果我仅采用
z
的第一个元素,则效果很好,但是,这不是我想要的行为。p, c = [], []
for z in mes:
print (z)
print (c)
print (p)
p.append(kf.x)
c.append(kf.P)
kf.predict()
kf.update(z[0])
更新其他信息
此错误来自
multivariate.py
in scipy。我似乎无法从cov
更改(1,1)
的形状。我可以使用mean
来更改z[0]
的长度,但是,这不是必需的。我想按原样使用z
。我还将整个代码发布为gist here。我还在卡尔曼滤波器中使用filterpy library。有一个使用此卡尔曼过滤器的live python notebook,但是,它不像我的场景中那样使用z
。 最佳答案
使用filterpy库时,您需要自行设置Kalman过滤器的初始状态,并且各个矩阵的维数必须兼容。如果您查看KalmanFilter.update()
方法,则可以跟踪它所做的计算,并对矩阵维度提出以下约束条件集:
R.shape == (dim_z, dim_z)
H.shape == (dim_z, dim_x)
P.shape == (dim_x, dim_x)
x.shape == (dim_x, 1...)
z.shape == (dim_z, 1...)
其中
1...
可以表示大小为1的某些尺寸序列,这两个序列相同。例如,对于您来说,使用dim_x == 4
和dim_z == 2
,因此可以使用x.shape == (4, 1)
和z.shape == (2, 1)
,或者可以使用x.shape == (4,)
和z.shape == (2,)
,但是不能混合匹配。 (请注意,KalmanFilter.__init__()
文档似乎为H
提供了错误的必需尺寸。)您的代码在两个地方设置了错误的尺寸:
将
H
设置为1x4矩阵,而不是应设置的2x4。 (我注意到这里您已经注释掉了有效的代码。)您将
R
设置为标量值,而不是2x2矩阵。可以说,卡尔曼滤波器的实现应该考虑到这一点,但是只有当您将R
作为参数传递给update()
时才这样做,而不是事先设置时。 (但是请注意:如果将R
设置为标量,代码仍然可以正常工作!尽管如此,它还是会做错事,尽管:将2加到矩阵的每个元素上,而不是将2倍加到矩阵上。单位矩阵。)当您将
z
传递给update()
方法时,您传递的是一个由两个元素组成的列表,该列表将转换为一个2个元素的向量,而不是一个2x1矩阵,因为它应该与x
兼容( 4x1)。您可以通过在调用z = np.array([z]).T
之前在循环体内运行update()
来解决此问题。但是我认为有一种更好的方法:将z
保留原样,仅将x
设为4元素向量:x = np.array([measurements[0][0],measurements[0][1],0.,0.])
我不确定这是否意味着作者可以使用,但是(目前)可以,而且应该可以。我认为要求将每个度量转换为2x1矩阵再传递它是一种愚蠢的做法。
KalmanFilter
包括test_matrix_dimensions()
方法,可用于检查设置中的错误。但是我对此有些矛盾,因为如您在上一段中所建议的那样,如果将x
设置为4元素向量,则会将其标记为不正确。关于python-3.x - 尺寸不匹配:数组“cov”的形状为(1,1),但“均值”是长度为2的向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33930446/