在Python中,小浮点数趋于零

Pra*_*vel 23 python floating-point numerical-stability

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

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

Muh*_*uri 24

你描述的是朴素贝叶斯分类器的标准问题.您可以搜索下溢以查找答案.或者看这里.

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

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


rec*_*ive 17

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


I82*_*uch 7

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


sup*_*een 5

看一下stdlib 中的Decimal

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)
Run Code Online (Sandbox Code Playgroud)

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