我有一个对应于概率分布的Nx1数组,即元素之和总和为1.这表示为常规的numpy数组。由于N可能相对较大,例如10或20,许多单独的元素非常接近0.我发现当我采用log(my_array)时,我得到错误“FloatingPointError:在日志中遇到无效值”。请注意,这是在故意设置numpy中的seterr(invalid ='raise')之后。
我该如何处理这个数字问题?我想表示对应于概率分布及其记录的向量而不舍入为0,从那以后我最终得到log(0),这会引起错误。
感谢。
答案 0 :(得分:3)
您可以根据所需的准确度放下尾巴。
eps = 1e-50
array[array<eps]=eps
log(array)
答案 1 :(得分:2)
什么非常接近于零?
>>> np.log(0)
-inf
>>> 0.*np.log(0)
nan
>>> np.log(1e-200)
-460.51701859880916
>>> 1e-200*np.log(1e-200)
-4.6051701859880914e-198
一种解决方案是在所有概率上加一个小的正数,以限制它们远离零。
第二个解决方案是显式处理零,例如在结果数组中用零替换0. * np.log(0),或者仅包括概率数组中具有非零概率的点
答案 2 :(得分:1)
他们的“非常接近”是多少? Python似乎很高兴记录10 ^ -very large:
>>> log(0.0000000000000000000000000001)
-64.472382603833282
另外,你为什么要记录日志?一旦你服用它们,你打算用它们做什么?
答案 3 :(得分:0)
根据您之后所做的事情,您可以使用不像log那样在零值上爆炸的不同变换。也许是sigmoid function或其他具有明确定义的雅可比行列式的东西。
如果您只想查看数据,可以在记录日志之前添加一些微小的值。