在Python中,接近零的小浮点数

24
我有一个用Python编写的贝叶斯分类器,问题是当我将特征概率相乘时,会得到非常小的浮点数值,比如2.5e-320之类的,然后突然变成0.0。对我来说,0.0显然没有用,因为我必须找到"最佳"类别,基于哪个类别返回最大值(更大的值)。
应该如何处理这种情况?我想过查找数字的指数部分(-320),如果太低,则将值乘以1e20或类似的值。但也许有更好的方法?

23
这不是数学。在数学中,正数可以任意小。这是浮点数。 - recursive
6
这绝对不是一个数学问题。这与Python以及其他编程语言中浮点数的工作方式有关。请注意,我不会改变原文的意思,只会尽力使翻译更易懂。 - Justin L.
12
我认为2.5e-320是一头鲸突然变成紫罗兰花盆的确切概率。 - Seth
6
为了公平起见,S.Lott所提出的下溢问题是贝叶斯分类器机器学习文献中的标准问题之一。因此,原帖作者更应该向相关社区寻求帮助。顺便说一下,数值分析是研究这类问题的数学部分。 - Muhammad Alkarouri
@Seth:使用无限概率驱动器,这应该能让你走得更远:) - Muhammad Alkarouri
这与浮点数及其在其他编程语言中的工作方式有关。我的观点是,Python部分与此无关。"这个下溢问题在机器学习文献中是一个标准问题"。谢谢。 - S.Lott
4个回答

24
您描述的问题是朴素贝叶斯分类器的一个标准问题。您可以搜索“underflow”来找到答案,或者点击这里了解更多信息。
简短的回答是,在标准朴素贝叶斯分类器中,通常使用对数来表达概率,因此您需要将概率的对数相加,而不是将它们相乘。
您可能还想查看其他分类算法。

嘿!非常感谢您的回答,我会仔细研究的,因为它正好解决了我的问题。我认为这应该很普遍,因为我正在多次乘以像3.14e-05这样的概率,所以它们很快就会达到e-300级别(例如),当我在分类器中有很多特征时更是如此。 - Pravel
是的,正如递归所提到的,这可以通过使用对数并添加概率来解决。在穆罕默德提供的链接中,所有内容都有解释。感谢大家的回答! - Pravel

20

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


嘿!你的解决方案看起来很棒。它非常简单明了,似乎很容易尝试。谢谢!我会试一下的。 - Pravel

7

浮点数没有无限的精度,这就是为什么你看到的数字变成了0。你可以将所有概率乘以一个大的标量,这样你的数字就会保持在更高的范围内。如果你只关心最大值而不是数量级,那么你甚至不需要在最后进行除法。或者,你可以像ikanobori建议的那样使用无限精度小数。


5

Take a look at Decimal from the stdlib.

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

我不会在此发布结果,因为它相当冗长。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接