我有一个用Python编程的贝叶斯分类器,问题是当我乘以特征概率时,我得到非常小的浮点值,如2.5e-320或类似的东西,突然它变成0.0。 0.0对我来说显然没有用处,因为我必须根据哪个类返回MAX值(更大的值)来找到“最佳”类。在Python中,小浮点数趋于零
什么是解决这个问题的最佳方法?我想过要找到数字的指数部分(-320),如果它太低,则将值乘以1e20或类似的值。但也许有更好的方法?
我有一个用Python编程的贝叶斯分类器,问题是当我乘以特征概率时,我得到非常小的浮点值,如2.5e-320或类似的东西,突然它变成0.0。 0.0对我来说显然没有用处,因为我必须根据哪个类返回MAX值(更大的值)来找到“最佳”类。在Python中,小浮点数趋于零
什么是解决这个问题的最佳方法?我想过要找到数字的指数部分(-320),如果它太低,则将值乘以1e20或类似的值。但也许有更好的方法?
您所描述的是朴素贝叶斯分类器的标准问题。您可以搜索下溢以找到答案。或见here。
简短的回答是它是标准来表达所有关于对数。因此,不是将概率相乘,而是将它们的对数相加。
您可能还想查看其他算法以及分类。
看看stdlib中的Decimal。
from decimal import Decimal, getcontext
getcontext().prec = 320
Decimal(1)/Decimal(7)
我不在这里发布结果,因为它很长。
Floating point数字没有无限的精度,这就是为什么你看到数字变为0的原因了。你可以用一个大的标量乘以所有的概率,以便你的数字保持在一个更高的范围内?如果你只关心最大值而不是重要值,那么最后你甚至不需要费心去分割。或者你可以使用无限精度小数,就像ikanobori所说的那样。
是否有可能在对数空间中完成您的工作? (例如,不是存储1e-320
,而是存储-320
,并使用加法而不是乘法)
嘿!你的解决方案似乎很棒这非常简单,而且看起来很容易尝试。谢谢!我会尝试。 – Pravel 2010-09-14 02:11:21
这不是数学。在数学中,正数可以是任意小的。这是浮点数。 – recursive 2010-09-13 21:41:39
@S。洛特这绝对不是一个数学问题。这与浮点数和它们在Python以及其他编程语言中的工作方式有关。 – 2010-09-13 21:45:24
我相信2.5e-320是鲸鱼突然变成一碗牵牛花的确切概率。 – Seth 2010-09-13 21:49:37