【问题标题】:Numba support for big integers?Numba 支持大整数吗?
【发布时间】:2019-02-22 11:57:56
【问题描述】:

我有一个包含前 30 个整数阶乘的阶乘查找表。此表在使用numba.njit 编译的函数中使用。问题是,超过 20!,该数字大于 64 位有符号整数 (9,223,372,036,854,775,807),这会导致 numba to raise a TypingError。如果表缩减为仅包含前 20 个整数阶乘,则该函数运行良好。

有没有办法在 numba 中解决这个问题?也许通过在使用查找表的 jit 编译函数中声明更大的整数类型?

【问题讨论】:

  • 您是否有机会尝试使用 Numba 计算 Beta 分布的概率密度?
  • @jwalton3141 是的,使用Spouge's approximation。我想一旦我得到优化和准确的gamma function,它将是一个很好的内核,我可以在许多发行版(beta,t gamma)中使用。

标签: python biginteger factorial numba


【解决方案1】:

在 Numba 中可能有一些方法可以处理大整数,但它不是我所知道的方法。

但是,由于我们知道您正在尝试在 Numba 中手动编码对 Beta distribution 的评估,因此我还有一些其他建议。

首先,我们必须小心我们的语言,以免混淆Beta distributionBeta function

我实际上建议将所有计算转移到对数刻度上。也就是说,不是计算 Beta 分布的 pdf,而是计算 Beta 分布的 pdf 的对数

这个技巧通常用于统计计算,因为 pdf 的对数在数值上比 pdf 更稳定。例如,Stan project 专门用于计算对数后验密度。

从你的发帖记录我也知道你对 MCMC 很感兴趣;使用日志 pdf 执行 MCMC 也是常见的做法。在 MCMC 的情况下,不是使后验与之前的可能性成正比,而是在对数尺度上,您将拥有 log-后验与 log-先验成正比加上 log-可能性。

我建议您使用对数分布,因为这样可以避免为大 n 计算 $\Gamma(n)$,这很容易导致整数溢出。相反,您计算 $\log(\Gamma(n))$。但是你不需要计算 $\Gamma(n)$ 来计算 $\log(\Gamma(n))$ 吗?实际上,没有。您可以查看scipy.special 函数gammaln,它完全避免了计算$\Gamma(n)$。一种前进的方法是查看scipy.special.gammaln 中的源代码,并从中制作您自己的 numba 实现。

在您的评论中,您还提到使用Spouge's Approximation 来近似 Gamma 函数。我以前没有使用过 Spouge 的近似值,但我在 Stirling's approximation 上取得了成功。如果您想使用这些近似值之一,在对数尺度上工作,您现在将获取近似值的对数。您需要使用rules of logs 来重写这些近似值。

考虑到以上所有因素,我建议将计算从 pdf 转移到 pdf 的日志中。要计算 Beta 发行版的日志 pdf,我会使用 this approximation of the Beta function。使用日志规则重写这个近似值和 Beta pdf。然后你可以实现这是 Numba 而不必担心整数溢出。

编辑

抱歉,我不知道如何格式化堆栈溢出的数学。

【讨论】:

  • 欢迎来到千人俱乐部(哈哈,jk)。我真的很感激这个答案,虽然它没有直接解决问题,但记录日志肯定会让我的最终目标变得更容易。
  • 谢谢,我对我的答案是否合适有两种看法(我知道我没有帮助处理 Numba 中的大量数字!),但我认为这是解决底层问题的另一种方法问题。我觉得使用日志 pdf 是一个更好的长期解决方案。
  • 另外,感谢俱乐部的欢迎 ;) 我确实想知道您是否注意到您的支持的重要性...
  • 是的,它在数值上肯定更稳定。它只涉及更多的数值近似和转换,我想最小化这些以保持计算的快速和准确。但如果正确实施,日志肯定是正确的方式
  • np,我看到你在过去几天里一直在疯狂地回答问题。我估计你会在一两个星期内超过我。你应该得到积分!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多