【发布时间】:2017-11-01 13:24:39
【问题描述】:
我无法计算这个。该代码适用于所有 N 值,包括 N = 57,但对于大于或等于 58 的 N 会引发溢出错误(34,“结果太大”)。有没有办法解决这个问题?谢谢。
import numpy as np
import scipy.integrate
import scipy.optimize
import warnings
warnings.filterwarnings('ignore')
R = 6
N = 58
Nb = 4
S_norm = 0.3
Ao = 1/8.02e-5
y = (N-Nb/R)/Ao
def likelihood(psi):
def func_likelihood(A):
sum = 0
for k in range(0, N+1):
r = (np.math.factorial(N-k+Nb)/(np.math.factorial(k)*np.math.factorial(N-k))*(A*psi*(1+R))**k)
sum = r+sum
return sum* (np.exp(-0.5*(np.log(A/Ao)/S_norm)**2)*np.exp(-A*psi)/A)
return (scipy.integrate.quad(func_likelihood, 0, np.inf, full_output=1,epsabs=1e-300, epsrel=1e-300))[0]
psi = y-y/10
MLE = scipy.optimize.fmin(lambda psi: -likelihood(psi), y, disp=0,full_output=1)[0][0]
normal_factor = 1/likelihood(MLE)
print(normal_factor* likelihood(psi))
【问题讨论】:
-
整数除法可能会有所帮助。例如,
(np.math.factorial(N-k+Nb) // (np.math.factorial(k)*np.math.factorial(N-k))或(np.math.factorial(N-k+Nb) // (np.math.factorial(k) // np.math.factorial(N-k))。顺便说一句,您不应该使用sum作为变量名,因为这会影响内置的sum函数。 -
在 scipy 或 numpy 中还应该有一个优化的二项式函数。
-
@PM2Ring,整数除法不会给出正确的结果。感谢您关于使用“总和”作为变量的建议。
-
哦,好吧,这是一个尝试。 ;) 您是否尝试重新排列这些术语,例如
(factorial(N-k+Nb) // factorial(N-k)) / factorial(k)?另一种选择是在range(N-k+Nb, N-k, -1)的循环中执行大乘法,然后找到该结果的 GCD 和factorial(k),这样您就可以在尝试浮点除法之前用整数除法消除公因数。 -
请注意,
np.math.factorial的拼写有点误导,因为它与 NumPy 无关:它只是常规的标准库math.factorial。 (np.math is math->True)
标签: python math integer-overflow exponentiation