我正在实现一个卡尔曼过滤器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导入之前添加 import matplotlib as mpl
时, nan
行的数量不同 . 同样,非 nan
数字与正确运行的版本中的数字相同 .
试图调试只会让我更加困惑 . 我在主循环的有问题的迭代中添加了print语句,它首先只给出了 nan
矩阵 . 当我再添加一个语句 print yt
时,打印 nan
的矩阵突然没有 nan
值 . 此外,在 import numpy as np
之前移动 import sys
语句会更改 nan
行的数量 . 在沿着这些线的实验中,我观察到当多次执行相同的文件时,值发生了变化(很多,例如从77变为3.32686992e 297),并且在进一步重复执行时回到原始值,在这两者之间随机振荡输出 . 没有保存状态,文件操作仅包含对 np.loadtxt
的一次调用 .
可能有用的更多信息:我有Python 2.7.6和Ubuntu 14.04,虽然在其他人的计算机上使用Python 2.7.8和spyder,行为类似 .
这种行为可能有什么来源?现在,我正在考虑在我们的计算机上使用巫术,巧合的神秘硬件故障,或者是一种旨在挫败Python程序员的邪恶病毒 .
1 回答
我能够看到*,所以我很难确定原因 . 话虽如此,代码中数值不稳定的一个明显来源是line 39上的矩阵求逆运算 .
实际上,您需要反转矩阵的情况很少 . 特别是,你应该使用因子分解,它总是更快,更稳定 .
您可以将
np.linalg.inv
的调用替换为np.linalg.solve,如下所示:看看这是否有助于您的稳定性问题 .
更新
你在上面的评论中提到你的
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.