我正在尝试处理一些会导致问题的非常小的概率。例如
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) 变得非常慢。
有什么方法可以解决这个问题?
最佳答案
非常小的概率的情况经常出现在机器学习和其他统计计算主题中。由于浮点数内部表示的限制,您会遇到精度错误。这可以使用任意精度算术来解决,但通常不这样做。
最流行的解决方案是使用 l og transformation to represent your probabilities 然后使用加法而不是乘法。这称为对数似然。这种变换避免了数字很小的问题,此外,对数似然值可以直接用于比较事物的概率(较低的对数似然总是意味着较低的概率)。
请注意,有一个 subtle distinction between likelihood and probability ,但是日志转换将非常小的数字转换为负数,并且小数位数的变化较少。
关于r - R中非常小的数字算术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43197137/