在Python中小浮点数趋近于零

24 投票
4 回答
19735 浏览
提问于 2025-04-16 04:06

我在用Python编写一个贝叶斯分类器,遇到一个问题,就是当我把特征的概率相乘时,得到的浮点数值非常小,比如2.5e-320之类的,结果突然变成了0.0。这个0.0对我来说完全没用,因为我需要根据哪个类别返回的值最大来找到“最佳”类别。

我该怎么处理这个问题呢?我想过找出这个数字的指数部分(比如-320),如果它太小,就把这个值乘以1e20或者类似的数值。但也许还有更好的办法?

4 个回答

7

浮点数并不是完全精确的,所以你看到的数字变成了0。你可以试着把所有的概率乘以一个很大的数,这样你的数字就能保持在更高的范围内。如果你只关心最大值而不在乎具体的大小,最后也不需要去除以那个数。或者,你可以使用一种无限精度的小数,就像ikanobori建议的那样。

20

你能否在一个对数空间中完成你的工作?(比如说,不用存储 1e-320 这个数,而是只存 -320,然后用加法代替乘法)

24

你描述的问题是朴素贝叶斯分类器常见的一个问题。你可以搜索一下“下溢出”来找到相关的答案,或者查看这里

简单来说,通常会用对数来表达这些内容。所以与其直接相乘概率,不如把它们的对数相加。

你也可以考虑看看其他的分类算法。

撰写回答