我正在numpy中实现卡尔曼滤波器。它工作正常,除了我导入matplotlib.pyplot以显示结果:
import numpy as np
import matplotlib.pyplot as plt # adding this line breaks things
import sys
完整代码为here。让我强调一下,在我导入之前它似乎正常工作;它打印出100 x 2数组,这些数字似乎是合理的。添加导入后,即使不使用pyplot中的任何内容,特定行之后的所有行都为nan
。非nan
的数字与之前相同。
我的第一个想法是它可能是名称冲突,但事实并非如此。您可以很容易地看到the code doesn't have anything named "plt",此外,它与下面描述的行为不一致。
当我从Sublime Text而不是命令行执行文件时,或者在pyplot导入之前添加nan
时,import matplotlib as mpl
行的数量不同。同样,非nan
数字与正确运行的版本相同。
尝试调试只会让我更加困惑。我在主循环的有问题的迭代中添加了print语句,它首先只给出了nan
个矩阵。当我再添加一个语句print yt
时,打印nan
的矩阵突然没有 - nan
值。此外,在import sys
之前移动import numpy as np
语句会更改nan
行的数量。在沿着这些线的实验中,我观察到当多次执行相同的文件时,值发生了变化(很多,例如从77变为3.32686992e + 297),并且在进一步重复执行时返回到原始值,在这两个输出之间随机振荡。没有保存状态,文件操作仅包含对np.loadtxt
的一次调用。
可能会有所帮助的更多信息:我有Python 2.7.6和Ubuntu 14.04,尽管在其他人的计算机上使用Python 2.7.8和spyder,行为类似。
这种行为的可能来源是什么?现在,我正在思考巫术,我们计算机上的巧妙神秘硬件故障,或者是一种旨在挫败Python程序员的邪恶病毒。
答案 0 :(得分:2)
我无法重现您所看到的错误*,因此我很难确定原因。话虽如此,代码中数值不稳定的一个明显来源是line 39上的矩阵求逆运算。
在实践中,您需要反转矩阵的情况非常少。特别是,你应该never use matrix inversion to solve systems of linear equations - 使用因子分解总是更快,数值更稳定。
您可以将np.linalg.inv
的来电替换为np.linalg.solve
,如下所示:
# aux_k = np.linalg.inv(psi.dot(sigmatt1[t]).dot(psi.T) + rmat)
# k[t] = sigmatt1[t].dot(psi.T).dot(aux_k)
A = psi.dot(sigmatt1[t]).dot(psi.T) + rmat
B = sigmatt1[t].dot(psi.T)
k[t] = np.linalg.solve(A, B.T).T
看看这是否有助于您的稳定性问题。
您在上面的评论中提到了numpy.__version__ == '1.8.2'
,但是您的matplotlib.__version__numpy__ == '1.5'
。这可能意味着matplotlib是针对numpy的旧版本(可能是不兼容的)构建的(你是如何安装这些库的?)。
我建议您尝试删除并重新安装matplotlib。
*我尝试使用numpy v1.8.2和v1.10.0.dev-8bcb756,链接到源自源代码的OpenBLAS 0.2.12或来自Ubuntu存储库的标准CBLAS库。我还尝试过matplotlib v1.3.1和v1.5.x.