【问题标题】:Does atan() provide any computational advantage over pnorm() in R?与 R 中的 pnorm() 相比,atan() 是否提供任何计算优势?
【发布时间】:2018-01-19 10:24:17
【问题描述】:

This article 描述了正常 CDF 的解析近似:

近似使用反正切函数,它也是数值近似的。我找到了some discussions 关于arctan 函数的一般算法,而且看起来很复杂。相比之下,R 中的 pnorm()source code 似乎非常简单,尽管它可能效率不高。

在 R 中使用 atan() 代替 pnorm() 是否有任何计算优势,尤其是在已经有大量基于普通 PDF 的其他数值计算的情况下,尤其是在大数据和高参数空间的情况下?

谢谢!

【问题讨论】:

  • 为什么不进行基准测试?
  • 好主意!我会尝试在此处发布结果。

标签: r trigonometry gaussian numerical-methods


【解决方案1】:

好奇地看了看

先定义函数

PNORM <- function(x) { 1/(exp(-358/23*x + 111*atan(37*x/294)) + 1) }

然后让我们看一下 [-4, 4] 范围内的差异

x <- seq(-4, 4, .01)
plot(x, pnorm(x)-PNORM(x), type="l", lwd=3, ylab="Difference")

这导致了这个图表

因此差异很小,但可能还不足以在某些应用程序中忽略。 YMMV。如果我们查看计算时间,那么它们与近似值大致相等,似乎略快

> microbenchmark::microbenchmark(pnorm(x), PNORM(x))
Unit: microseconds
     expr    min      lq     mean  median      uq    max neval cld
 pnorm(x) 34.703 34.8785 36.54254 35.1820 38.3150 47.786   100   b
 PNORM(x) 24.293 24.4625 27.07660 24.8875 28.9035 59.216   100  a 

【讨论】:

  • 我得到了非常相似的结果。虽然单独使用函数的计算优势很明显,但是我也对每个函数如何使用其他数值方法执行感兴趣,所以我比较了 pnormPNORM 的积分计算从 -Inf 到向量10000 个随机数 100 次。结果是惊人的 2.5% 性能提升 :( 平均差异约为 8e-5。我正在运行一个每次迭代需要数小时的算法,这并不能节省大量时间,至少在百分比方面不值得差异响应变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
相关资源
最近更新 更多