5

我有一个对应于概率分布的 Nx1 数组,即元素的总和为 1。这表示为常规的 numpy 数组。由于 N 可能相对较大,例如 10 或 20,因此许多单个元素非常接近 0。我发现当我使用 log(my_array) 时,我收到错误“FloatingPointError:log 中遇到无效值”。请注意,这是在故意在 numpy 中设置 seterr(invalid='raise') 之后。

我该如何处理这个数字问题?我想表示与概率分布相对应的向量及其取日志而不四舍五入为 0,因为那时我最终取 log(0),这会引发错误。

谢谢。

4

4 回答 4

3

您可以根据需要的精度放下尾巴。

eps = 1e-50
array[array<eps]=eps
log(array)
于 2010-11-17T16:37:37.083 回答
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) 替换为结果数组中的零,或者仅包括概率数组中具有非零概率的点

于 2010-11-17T16:32:59.923 回答
1

他们有多“接近”0?Python 似乎很高兴记录 10^-非常大:

>>> log(0.0000000000000000000000000001)
-64.472382603833282

另外,你为什么要记录日志?一旦你拿走了它们,你打算怎么处理它们?

于 2010-11-17T16:23:45.960 回答
0

根据您之后所做的事情,您可以使用不同的变换,它不会像 log 那样在零值上爆炸。也许是一个sigmoid 函数或其他具有明确定义的雅可比行列式的东西。

如果您只是想将数据可视化,您总是可以在获取日志之前添加一些微小的值。

于 2010-11-17T17:25:51.333 回答