24

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

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

4

4 回答 4

24

您描述的是朴素贝叶斯分类器的标准问题。您可以使用它搜索下溢以找到答案。或看这里

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

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

于 2010-09-13T21:50:57.740 回答
20

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

于 2010-09-13T21:43:01.450 回答
7

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

于 2010-09-13T21:39:09.180 回答
5

看看标准库中的十进制

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

我没有在这里发布结果,因为它很长。

于 2010-09-13T21:35:55.717 回答