我有一个用Python编写的贝叶斯分类器,问题是当我将特征概率相乘时,会得到非常小的浮点数值,比如2.5e-320之类的,然后突然变成0.0。对我来说,0.0显然没有用,因为我必须找到"最佳"类别,基于哪个类别返回最大值(更大的值)。
应该如何处理这种情况?我想过查找数字的指数部分(-320),如果太低,则将值乘以1e20或类似的值。但也许有更好的方法?
应该如何处理这种情况?我想过查找数字的指数部分(-320),如果太低,则将值乘以1e20或类似的值。但也许有更好的方法?
是否可以在对数空间中完成您的工作?(例如,不存储1e-320
,而是只存储-320
,并使用加法代替乘法)
浮点数没有无限的精度,这就是为什么你看到的数字变成了0。你可以将所有概率乘以一个大的标量,这样你的数字就会保持在更高的范围内。如果你只关心最大值而不是数量级,那么你甚至不需要在最后进行除法。或者,你可以像ikanobori建议的那样使用无限精度小数。
Take a look at Decimal from the stdlib.
from decimal import Decimal, getcontext
getcontext().prec = 320
Decimal(1) / Decimal(7)