在Python中,小浮点数趋于零

时间:2010-09-13 21:29:22

标签: python floating-point numerical-stability

我有一个用Python编程的贝叶斯分类器,问题是当我乘以特征概率时,我得到非常小的浮点值,如2.5e-320或类似的东西,突然变成0.0。 0.0显然对我没用,因为我必须找到基于哪个类返回MAX值(更大值)的“最佳”类。

处理这个问题的最佳方法是什么?我想到找到数字的指数部分(-320),如果它太低,则将该值乘以1e20或某个值。但也许有更好的方法?

4 个答案:

答案 0 :(得分:24)

您所描述的是朴素贝叶斯分类器的标准问题。您可以搜索下溢以查找答案。或者参见here

简短的回答是用对数来表达所有这些是标准的。因此,不是乘以概率,而是将它们的对数相加。

您可能还想查看其他算法以进行分类。

答案 1 :(得分:17)

是否可以在对数空间中完成工作? (例如,不是存储1e-320,而是存储-320,而是使用加法而不是乘法

答案 2 :(得分:7)

Floating point数字没有无限精度,这就是为什么你看到数字变为0.你能将所有概率乘以一个大标量,以便你的数字保持在更高的范围内吗?如果你只担心最大值而不是幅度,你甚至不需要在最后分心。或者你可以使用无限精度小数,就像ikanobori建议的那样。

答案 3 :(得分:4)

从stdlib看一下Decimal

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

我不会在这里公布结果,因为它很长。