R中算数很小的算术

时间:2017-04-04 02:06:09

标签: r floating-point

我正在尝试使用一些非常小的概率来解决问题。例如

probs <- c(4.225867e-03,3.463125e-04,2.480971e-05,1.660538e-06,1.074064e-07,6.829168e-09,4.305051e-10,2.702241e-11,1.692533e-12,1.058970e-13,6.622117e-15,4.139935e-16,2.587807e-17,1.617488e-18,1.010964e-19,6.318630e-21,3.949177e-22 2.468246e-23,1.542657e-24,9.641616e-26,6.026013e-27,3.766259e-28,2.353912e-29,1.471195e-30,9.194971e-32

然而,使用此向量的任何算术都会导致第12个条目之后的所有内容舍入为零(可能因为它小于.Machine $ double.eps)。例如:

probs > 0
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

1-probs < 1
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

我尝试过使用gmp包,但是我正在进行基于组合的计算,as.bigq(probs)在升级到大功率时变得非常慢。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:6)

机器学习和其他统计计算主题经常出现非常小的概率。由于浮点数的内部表示的限制,您将获得精度误差。这可以使用任意精度算法来解决,但这种情况并不常见。

最流行的解决方案是使用l og transformation to represent your probabilities然后使用加法而不是乘法。这称为 log-likelihood 。这种转换避免了数量非常小的问题,此外,对数似然值可以直接用于比较事物的概率(较低的对数似然总是意味着较低的概率)。

请注意,有subtle distinction between likelihood and probability,但是日志转换将非常小的数字转换为负数,而小数位数的变化较小,无论如何都可以。