导入时出现随机 nan 错误 matplotlib.pyplot
Random nan errors when importing matplotlib.pyplot
我正在用 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 sys
语句移动到 import numpy as np
语句之前会更改 nan
行数。在沿着这些方向进行的实验中,我观察到当多次执行同一个文件时,values 发生了变化(变化很大,例如从 77 到 3.32686992e+297),并且在进一步重复执行时回到原始值,在这两个输出之间随机振荡。没有保存状态,文件操作仅包含对 np.loadtxt
.
的一次调用
可能有帮助的更多信息:我有 Python 2.7.6 和 Ubuntu 14.04,尽管在其他人的计算机上 Python 2.7.8 和 spyder 的行为是相似的。
这种行为的可能来源是什么?现在,我在想要么是巫术,要么是我们两台计算机上巧合的神秘硬件故障,要么是一种旨在挫败 Python 程序员的邪恶病毒。
我无法重现您看到的错误*,因此我很难查明原因。话虽如此,代码中数值不稳定的一个明显来源是 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.
我正在用 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 sys
语句移动到 import numpy as np
语句之前会更改 nan
行数。在沿着这些方向进行的实验中,我观察到当多次执行同一个文件时,values 发生了变化(变化很大,例如从 77 到 3.32686992e+297),并且在进一步重复执行时回到原始值,在这两个输出之间随机振荡。没有保存状态,文件操作仅包含对 np.loadtxt
.
可能有帮助的更多信息:我有 Python 2.7.6 和 Ubuntu 14.04,尽管在其他人的计算机上 Python 2.7.8 和 spyder 的行为是相似的。
这种行为的可能来源是什么?现在,我在想要么是巫术,要么是我们两台计算机上巧合的神秘硬件故障,要么是一种旨在挫败 Python 程序员的邪恶病毒。
我无法重现您看到的错误*,因此我很难查明原因。话虽如此,代码中数值不稳定的一个明显来源是 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.