Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,趋向于零的小浮点数_Python_Floating Point_Numerical Stability - Fatal编程技术网

在Python中,趋向于零的小浮点数

在Python中,趋向于零的小浮点数,python,floating-point,numerical-stability,Python,Floating Point,Numerical Stability,我有一个用Python编程的贝叶斯分类器,问题是当我乘以特征概率时,我得到非常小的浮点值,比如2.5e-320或类似的值,然后突然变成0.0。0.0显然对我没有用处,因为我必须根据哪个类返回最大值(更大的值)找到“最佳”类 处理这个问题的最佳方法是什么?我想找到这个数的指数部分(-320),如果它太低,就把这个值乘以1e20或类似的值。但也许有更好的方法?从stdlib看一看 from decimal import Decimal, getcontext getcontext().prec =

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

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

从stdlib看一看

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

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

数字没有无限的精度,这就是为什么你看到数字变成了0。你能用一个大的标量乘以所有的概率,使你的数字保持在一个更高的范围内吗?如果你只担心最大值而不担心大小,你甚至不需要在最后费心去划分。或者,您可以使用无限精度的十进制,就像ikanobori建议的那样。

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

您描述的是朴素贝叶斯分类器的标准问题。你可以用它搜索底流来找到答案。或者看看

简而言之,用对数来表达所有这些是标准的。所以,你不用乘以概率,而是求它们的对数之和


您可能还需要查看其他分类算法。

这不是数学。在数学中,正数可以任意小。这是浮点。@S.Lott这绝对不是一道数学题。这与浮点数以及它们在Python和其他编程语言中的工作方式有关。我相信2.5e-320就是鲸鱼突然变成一碗牵牛花的确切概率。公平地说,S.洛特,这个下溢问题是机器学习文献中关于贝叶斯分类器的标准问题。因此,通过询问相关社区,OP会得到更多的服务。顺便说一句,这是数学中研究类似问题的部分。@Seth:这应该会让你用无限概率驱动力走得更远:)嘿!非常感谢你的回答,我会调查一下,因为这正好解决了我的问题。我想这应该是很常见的,因为我将概率像3.14e-05乘以很多倍,所以它们达到e-300水平(例如)相当快,当我的分类器中有很多功能时,甚至更快。是的,正如递归所提到的,这是通过使用对数和添加概率来解决的。在穆罕默德提供的链接中,所有内容都已解释。谢谢大家的回答!嘿你的解决方案似乎很好。它非常简单,似乎很容易尝试。谢谢我试试看。