Numba支持大整数?

问题描述 投票:2回答:1

我有一个因子查找表,其中包含前30个整数阶乘。此表用于使用numba.njit编译的函数。问题是,在20!以上,数字大于64位有符号整数(9,223,372,036,854,775,807),这会导致numba to raise a TypingError。如果表减少到只包含前20个整数阶乘,则函数运行正常。

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

python biginteger factorial numba
1个回答
1
投票

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

但是,既然我们知道您正在尝试手工编写Numba中Beta distribution的评估,我还有其他一些建议。

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

我实际建议的是将所有计算都转移到对数刻度上。也就是说,不是计算Beta发行版的pdf,而是计算Beta发行版的pdf日志。

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

从你的帖子历史我也知道你对MCMC感兴趣;通常的做法是使用log pdfs来执行MCMC。在MCMC的情况下,不是将后验与先验时间成比例,在对数尺度上,您将具有与对数先验加上对数似然成比例的对数后验。

我建议你使用日志分配,因为这可以避免为大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而不必担心整数溢出。

Edit

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

© www.soinside.com 2019 - 2024. All rights reserved.