我正在尝试执行以下代码

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 == 4dim_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/

10-14 01:06