首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >朴素贝叶斯分类浮点底流

朴素贝叶斯分类浮点底流
EN

Stack Overflow用户
提问于 2016-01-30 05:59:20
回答 1查看 1.1K关注 0票数 2

在Na中将大量概率相乘会导致浮点下溢.

代码语言:javascript
复制
P(x_1,….,x_n│c) = P(x_1│c).P(x_2│c).P(x_3│c)… … P(x_n |c) 

使用以下公式是否更可行/更好,而不是使用上述公式(结果导致浮点下溢)?还是会截断信息?

代码语言:javascript
复制
log(xy) = log(x) + log(y)
EN

回答 1

Stack Overflow用户

发布于 2016-01-30 17:33:54

假设所有的概率都在一个合理的范围内,例如2^{-63},2^{63},您可以这样累积产品:

代码语言:javascript
复制
double prod(double *d, int n, int64_t *expo) {
  *expo = 0;
  double ans = 1;
  for (int i = 0; i < n; i++) {
    ans *= d[i];
    if (!(i % 16)) {
      int foo = 0;
      ans = frexp(ans, &foo);
      expo += foo;
    }
  }
}

然后,乘积在返回值乘以2^{*expo}的n/2ULP内。这段代码很容易矢量化,而且也很容易为这种特殊情况编写另一种更快的frexp,这种特殊情况只是篡改和忽略NaNs/无穷大/零/异常。

如果您的平台支持捕获浮点算法,并且您的输入位于合理但未知的范围内,则可以通过为溢出和下流添加陷阱处理程序来自适应地选择对大型n性能影响最小的步长。如果您用平台的汇编语言编写产品例程和陷阱处理程序,那么这可能是最简单的。

如果你把对数加起来,你就会失去相当大的精度,首先是通过取对数,然后再加上它们,这是你可能关心的,也可能不是你关心的。更糟糕的是,通过计算如此多的对数,你也损失了相当大的速度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35098579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档