java - 计算值太大而无法求幂的马尔可夫链概率

标签 java estimation double-precision markov-chains exp

我使用公式 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])的总和。

最佳答案

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

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]) 在 double 下计算为零。然而,这些项目的实际概率非常小,以至于它们的实际概率和零之间没有实际差异,因此 exp(X[i]) 下溢到零是可以的。

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

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

关于java - 计算值太大而无法求幂的马尔可夫链概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011803/

相关文章:

java - 执行外部命令并从 Jython 2.1 读取 stderr/stdout

r - 需要有关 R 中 MCMC 估计的建议

project-management - 如何估计使用新技术的时间?

c++ - 为什么 float 中的精度问题会因值而异?

java - Spring安全和Spring引导

Java类加载器

unit-testing - 编码时间与单元测试时间之比

Windows 下 Visual Studio 2012/英特尔编译器的 C++ double 失败

c++ - 处理线性代数的最佳基类型

java - 如何在滑动窗口中获取当前窗口时间?