【问题标题】:normalizing a list of very small double numbers (likelihoods)标准化一个非常小的双数列表(可能性)
【发布时间】:2013-08-06 19:34:40
【问题描述】:

我正在编写一个算法,在给定模型的情况下,我计算数据集列表的可能性,然后需要对每个可能性进行归一化(到概率)。所以像 [0.00043, 0.00004, 0.00321] 这样的东西可能会被转换成 [0.2, 0.03, 0.77]。 我的问题是,我正在使用的对数可能性非常小(例如,在对数空间中,这些值类似于 -269647.432、-231444.981 等)。在我的 C++ 代码中,当我尝试添加其中两个(通过取它们的指数)时,我得到“Inf”的答案。我试图将它们添加到日志空间(Summation/Subtraction of log),但再次偶然发现了同样的问题。

任何人都可以分享他/她对此的专家意见吗?

谢谢

【问题讨论】:

  • 有些东西闻起来不对劲。有了这些对数,就会有很多 糟糕 的零。你计算对了吗?你能展示一些你的代码吗?
  • 您能否向我们展示您的代码的可管理部分,以便我们更好地了解您的问题?
  • 所以,为了清楚起见,您需要将 6 位负数范围内的一些数字“归一化”,作为实际值的对数。那将使您以不可能的驱动器进行长途旅行。 (hitchhikers.wikia.com/wiki/Infinite_Improbability_Drive‎)。正如约翰所说,这似乎是错误的......这些数字是如此之小,以至于在宇宙中打电子高尔夫球时击中一个原子的可能性更大。
  • 给定叶子上的一组蛋白质序列,计算系统发育树的可能性。由于 n-叶无根树的树数呈指数级,因此找到如此低的似然数并不意外(考虑 500 片叶子的二叉树,每片叶子包含 1000 多个蛋白质字符)。即使我们谈论大约 -2k 到 -3k 的对数似然,我们能找到一些合理的估计吗?
  • 我认为这里计算的数字仅与实际可能性成正比,所以不要被小尺寸所迷惑。它们都有一个相同的除数,因此通常不计算,但在这种情况下也可能非常小。

标签: c++ probability logarithm


【解决方案1】:

假设已经正确计算了可能性,您可以将它们中的每一个除以最大可能性。这可以通过从每个对数似然中减去最大对数似然以对数形式完成。

然后您可以转换出对数空间。最大的将是 1.0,因为它的归一化日志是 0。较小的将分别在 0 和 1.0 之间,并表示为最大的分数。

【讨论】:

  • 这当然是假设最大和最小的数字在彼此的合理范围内。在给出的示例数字中,差异大约为 34000 - 这仍然远远超出常规浮点数的范围,即使它是 log2 并使用 80 位长双精度数,其指数为 2^+/-16383。
  • @MatsPetersson 这些大比例比小尺寸更让我烦恼。贝叶斯方程中有一个通常不计算的归一化常数,因为它在所有情况下都是相同的。一切都小可能是因为这个。
  • 感谢您的提示。我会尝试并告诉你
  • @PatriciaShanahan 我同意这些比率是相关的,绝对值得研究,但可能只是模型非常确信较小的概率具有无穷小。
【解决方案2】:

这是标准程序。数值稳定的Matlab代码:

LL = [ . . . ];  % vector of log-likelihoods
M = max(LL);
LL = LL - M;
L = exp(LL);
L = L ./ sum(L);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多