【问题标题】:Is there a way to handle calculations invovling exponential of big values in R?有没有办法处理涉及 R 中大值指数的计算?
【发布时间】:2020-03-24 17:08:04
【问题描述】:

我在网上和网站上看了一些,但没有找到任何解决方案。我的问题相对简单,所以如果你能指出一个可能的解决方案,非常感谢。

test_vec <- c(2,8,709,600)
mean(exp(test_vec))

test_vec_bis <- c(2,8,710,600)
mean(exp(test_vec_bis))
exp(709)
exp(710)
# The numerical limit of R is at exp(709)

我如何计算向量的平均值并处理 Inf 值,知道 R 可能处理平均值但不是平均值计算的分子中的所有值?

【问题讨论】:

标签: r precision numeric


【解决方案1】:

有一种极端情况,您可以通过简单地以数学方式重述您的问题来解决您的问题,但这需要您的向量长度非常大和/或您的 exp.数字接近数字限制:

由于sum(x)/n 的平均值可以写为sum(x/n),并且由于exp(x)/exp(y) = exp(x-y),您可以计算sum(exp(x-log(n))),这样可以减轻log(n)。

mean(exp(test_vec))
[1] 2.054602e+307
sum(exp(test_vec - log(length(test_vec))))
[1] 2.054602e+307

sum(exp(test_vec_bis - log(length(test_vec_bis))))
[1] 5.584987e+307

虽然这适用于您的示例,但很可能这不适用于您的真实向量。 在这种情况下,您将不得不参考 @fra 建议的 Rmpfr 之类的软件包。

【讨论】:

  • 好主意,但仅适用于您所说的接近极限的值。谢谢 ! 'Rmpfr' 包是我迄今为止找到的最佳解决方案。
【解决方案2】:

这是您有资格仅选择test_vec 中给出答案的人的一种方式Inf:

mean(exp(test_vec)[which(exp(test_vec) < Inf)])

[1] 1.257673e+260

t2 <- c(2,8,600)
mean(exp(t2))

[1] 1.257673e+260

当然,这假设您要排除导致Inf的值。

【讨论】:

  • 感谢您的回复。不,我实际上考虑过这个选项,但我必须包含每个值。在这种情况下,截断不是一种选择...
猜你喜欢
  • 2015-06-06
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2016-09-06
  • 2021-06-02
相关资源
最近更新 更多