11

logsumexp有人知道提供-function的开源数字 C 库吗?

logsumexp(a)函数计算数组 a 的分量的指数 log(e^{a_1}+...e^{a_n}) 之和,避免数值溢出。

4

1 回答 1

11

这是一个从头开始的非常简单的实现(至少经过最低限度的测试):

double logsumexp(double nums[], size_t ct) {
  double max_exp = nums[0], sum = 0.0;
  size_t i;

  for (i = 1 ; i < ct ; i++)
    if (nums[i] > max_exp)
      max_exp = nums[i];

  for (i = 0; i < ct ; i++)
    sum += exp(nums[i] - max_exp);

  return log(sum) + max_exp;
}

这可以有效地将所有参数除以最大值,然后在最后添加它的日志以避免溢出,所以它对于添加大量类似缩放的值是很好的,如果一些错误会蔓延参数比其他参数大许多数量级。

如果您希望它在给定 0 个参数时运行而不会崩溃,则必须为此添加一个案例:)

于 2010-11-12T23:54:54.197 回答