【发布时间】:2017-08-02 17:40:52
【问题描述】:
我用 Java 编写了一个程序,它需要我计算一些概率,对于较大的输入,概率最终会变得非常小。因此,为了防止下溢问题,我想取而代之的是日志概率。
但是,我在执行此操作时遇到了麻烦。在计算的每个阶段,可以有不同数量的选项,需要为其分配概率,并且每个阶段它们需要加起来为 1。概率基于许多不同的变量。我使用以下公式对所有可能性求和:
Math.pow(d[i], a) * Math.pow(1/c[i], b)
这给了我一个变量total。然后建立概率p_i,
p_i = (Math.pow(d[i], a) * Math.pow(1/c[i], b)) / total
我的问题是,如何使用对数概率来实现这一点,这样我就不会得到“Infinity”和“NaN”值,因为这些是我到目前为止所得到的。
【问题讨论】:
-
不要以为求和的对数可以化简
-
那么,是不是说在这里实现日志概率是不可能的?
-
为什么不使用 BigDecimal?
-
您可能需要切换到使用 BigDecimal,因为它允许任意精度。
-
我倾向于你必须使用
BigDecimal,但不幸的是,我认为你必须使用roll your own 对数函数BigDecimal。没有内置的惊人...
标签: java math probability