2010-09-13 74 views
21

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

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

+23

这不是数学。在数学中,正数可以是任意小的。这是浮点数。 – recursive 2010-09-13 21:41:39

+6

@S。洛特这绝对不是一个数学问题。这与浮点数和它们在Python以及其他编程语言中的工作方式有关。 – 2010-09-13 21:45:24

+12

我相信2.5e-320是鲸鱼突然变成一碗牵牛花的确切概率。 – Seth 2010-09-13 21:49:37

回答

22

您所描述的是朴素贝叶斯分类器的标准问题。您可以搜索下溢以找到答案。或见here

简短的回答是它是标准来表达所有关于对数。因此,不是将概率相乘,而是将它们的对数相加。

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

+0

嘿!非常感谢答案,我会仔细研究,因为它完全解决了我的问题。我认为这应该是常见的,因为我多次乘以3.14e-05这样的概率,所以当我在分类器中有很多特征时,它们达到了e-300级别(例如)非常快,甚至更多。 – Pravel 2010-09-14 02:03:41

+0

是的递归也提到了,这是通过使用对数和添加概率来解决的。在穆罕默德提供的链接中,所有的解释。感谢大家的答案! – Pravel 2010-09-14 02:31:49

3

看看stdlib中的Decimal

from decimal import Decimal, getcontext 

getcontext().prec = 320 

Decimal(1)/Decimal(7) 

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

7

Floating point数字没有无限的精度,这就是为什么你看到数字变为0的原因了。你可以用一个大的标量乘以所有的概率,以便你的数字保持在一个更高的范围内?如果你只关心最大值而不是重要值,那么最后你甚至不需要费心去分割。或者你可以使用无限精度小数,就像ikanobori所说的那样。

17

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

+0

嘿!你的解决方案似乎很棒这非常简单,而且看起来很容易尝试。谢谢!我会尝试。 – Pravel 2010-09-14 02:11:21