我遇到了必须进行以下计算的问题:
N = 250
H = 140
bayes_factor = factorial(H) * factorial(N-H) / factorial(N+1) / (0.5**N)
如何解决问题: 我尝试过:
from scipy.special import factorial
bayes_factor = (factorial(H) * factorial(N-H)) / factorial(N+1) / (0.5**N)
给出无限。
更新:分母阶乘(H + 1)中固定的错字应为阶乘(N + 1)。
注意:答案应该在0.5左右,因为硬币可能是无偏的。
答案是值得的。
答案 0 :(得分:1)
最好使用scipy.special函数loggamma进行对数运算。伽玛函数满意文件
n! = gamma( n+1)
因此,您给出的表达式可以计算为
exp( loggamma( H+1) + loggamma( N-H+1) - loggamma( N+2) - N*log(0.5))
使用对数的原因是中间项(例如阶乘(N + 1))是如此之大,以至于会翻倍。
答案 1 :(得分:1)
要获得确切的解决方案,您可以使用this post中提到的阶乘的以下实现:
def range_prod(lo,hi):
if lo+1 < hi:
mid = (hi+lo)//2
return range_prod(lo,mid) * range_prod(mid+1,hi)
if lo == hi:
return lo
return lo*hi
def tree_factorial(n):
if n < 2:
return 1
return range_prod(1,n)
因此,您的程序将是:
N = 250
H = 140
bayes_factor = tree_factorial(H) * tree_factorial(N-H) / tree_factorial(N+1) / (0.5**N)
您可以运行代码here。结果是:
Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
bayes_factor: 0.476723359160760
running time: 0.000546