我有一个用Python编程的贝叶斯分类器,问题是当我乘以特征概率时,我得到非常小的浮点值,如2.5e-320或类似的东西,突然变成0.0。 0.0显然对我没用,因为我必须找到基于哪个类返回MAX值(更大值)的“最佳”类。
处理这个问题的最佳方法是什么?我想到找到数字的指数部分(-320),如果它太低,则将该值乘以1e20或某个值。但也许有更好的方法?
答案 0 :(得分:24)
您所描述的是朴素贝叶斯分类器的标准问题。您可以搜索下溢以查找答案。或者参见here。
简短的回答是用对数来表达所有这些是标准的。因此,不是乘以概率,而是将它们的对数相加。
您可能还想查看其他算法以进行分类。
答案 1 :(得分:17)
是否可以在对数空间中完成工作? (例如,不是存储1e-320
,而是存储-320
,而是使用加法而不是乘法
答案 2 :(得分:7)
Floating point数字没有无限精度,这就是为什么你看到数字变为0.你能将所有概率乘以一个大标量,以便你的数字保持在更高的范围内吗?如果你只担心最大值而不是幅度,你甚至不需要在最后分心。或者你可以使用无限精度小数,就像ikanobori建议的那样。
答案 3 :(得分:4)
从stdlib看一下Decimal。
from decimal import Decimal, getcontext
getcontext().prec = 320
Decimal(1) / Decimal(7)
我不会在这里公布结果,因为它很长。