2010-11-17 65 views
5

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

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

谢谢。

+0

零概率是一个特例,为什么你会认为它与非零概率相同?为什么不简单地将其从数据中滤除并且仅与非零工作? – 2010-11-17 16:28:38

+1

您是否仔细检查过发布中的所有值是否都是正值?没有负值和没有完全为零的值?真正的小数值应该不重要。 – 2010-11-18 15:17:08

+0

同样的问题:http://stackoverflow.com/questions/3704570/in-python-small-floats-tending-to-zero – monkut 2012-05-11 04:22:55

回答

1

它们“非常接近”0?蟒蛇似乎的10^- 非常大的快乐回吐日志:

>>> log(0.0000000000000000000000000001) 
-64.472382603833282 

另外,为什么你要带日志?一旦你拿走他们,你打算怎么做?

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

你可以根据您需要的准确性放下尾巴。

eps = 1e-50 
array[array<eps]=eps 
log(array) 
0

根据您之后的工作情况,您可以使用另一种不会在零值(如log)上发生爆炸的转换。也许是一个sigmoid function或其他具有明确定义的雅可比行列式。

如果您只是想要可视化数据,您可以在记录日志之前添加一些微小的值。

相关问题