【问题标题】:Calculating Markov chain probabilities with values too large to exponentiate计算值太大而无法取幂的马尔可夫链概率
【发布时间】:2012-08-17 19:10:40
【问题描述】:

我使用公式 exp(X) 作为马尔可夫链的速率。所以选择一个链接相对于另一个链接的比率是 exp(X1)/exp(X2)。我的问题是有时候X很大,所以exp(X)会超出double的范围。

或者:给定一个 X[i] 数组,其中一些 X[i] 大到 exp(X[i]) 超出了double 的范围,计算每个 i 的 exp(X[i] ) / S,其中 S 是所有 exp(X[i]) 的总和。

【问题讨论】:

  • 我进行了编辑以澄清您的问题和我的答案。如果我错了,你可以恢复它们。

标签: java estimation double-precision markov-chains exp


【解决方案1】:

这个伪代码应该可以工作:

Let M = the largest X[i].

For each i:
    Subtract M from X[i].

Let S = the sum of exp(X[i]) for all i.

For each i:
    The probability for this i is exp(X[i]) / S.

如果 M 很大,那么在减法步骤之后,一些 X[i] 将非常小(具有很大的负值),以至于它们的 exp(X[i]) 将在双精度下计算为零。但是,这些项目的实际概率非常小,以至于它们的实际概率与零之间没有实际差异,因此 exp(X[i]) 下溢为零是可以的。

除了下溢和舍入误差之外,减法转换后的概率应该是相同的,因为:

  • exp(x-M) = exp(x)/exp(M)。
  • 这种除法以相同的方式影响概率的分子和分母,因此比率保持不变。

【讨论】:

  • 我明白了,但我想运行马尔科夫链。我必须选择一个概率为 exp(X1)/sum(exp(Xi)) 的链接。相反,我创建了一个 exp(Xi)s 的累积数组。并生成一个介于 0 到 exp(Xn) 之间的数字。所以我不需要这个比例。我需要实际数字
  • 什么太大而不能表示为双精度数、X 或 exp(X)? (当“X”是最接近的前面名词时,你写了“it will get out of double range”。)如果 X 太大,你必须在担心 exp(X) 之前解决这个问题。如果 exp(X) 太大,则通过从它们中减去最大的 Xi 来归一化你的 Xi(使它们中的最大值为 0,其余为非正数)。这应该将所有重要的 exp(Xi) 留在双精度范围内,而不会改变概率。 (任何变成大负值的 Xi 的概率都很小,所以如果 exp(Xi) 为零也没关系。)
猜你喜欢
  • 2014-10-06
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2019-02-07
  • 1970-01-01
  • 2022-01-24
  • 2018-03-25
相关资源
最近更新 更多