在Na中将大量概率相乘会导致浮点下溢.
P(x_1,….,x_n│c) = P(x_1│c).P(x_2│c).P(x_3│c)… … P(x_n |c) 使用以下公式是否更可行/更好,而不是使用上述公式(结果导致浮点下溢)?还是会截断信息?
log(xy) = log(x) + log(y)发布于 2016-01-30 17:33:54
假设所有的概率都在一个合理的范围内,例如2^{-63},2^{63},您可以这样累积产品:
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性能影响最小的步长。如果您用平台的汇编语言编写产品例程和陷阱处理程序,那么这可能是最简单的。
如果你把对数加起来,你就会失去相当大的精度,首先是通过取对数,然后再加上它们,这是你可能关心的,也可能不是你关心的。更糟糕的是,通过计算如此多的对数,你也损失了相当大的速度。
https://stackoverflow.com/questions/35098579
复制相似问题