我想计算python上的二项式概率。我试着运用这个公式:
probability = scipy.misc.comb(n,k)*(p**k)*((1-p)**(n-k))
我得到的一些可能性是无限的。我检查了一些p=inf的值,其中一个n=450000,k=17。此值必须大于1e302,后者是浮点处理的最大值。在
然后我尝试使用sum(np.random.binomial(n,p,numberOfTrials)==valueOfInterest)/numberOfTrials
这将绘制numberOfTrials样本,并计算利息值的平均绘制次数。在
这不会引发任何无穷大的值。然而,这是一种有效的方法吗?为什么这种方法不会产生任何无穷大的值,而计算概率呢?在
我认为你应该用对数来计算:
因为您使用的是scipy,我想我应该提到scipy已经实现了统计分布。还要注意,当n这么大时,二项分布很好地近似于正态分布(或泊松,如果p很小)。在
在对数域中计算组合函数和幂函数,然后将它们提升为指数。在
像这样:
由于数字太大而导致数值下溢/溢出。在使用
n=450000
和p = 0.5, k = 17
的示例中,它返回p_log = -311728.4
,即,最终概率的日志非常小,因此在使用np.exp
时发生下溢。但是,您仍然可以使用对数概率。在相关问题 更多 >
编程相关推荐