scipy.misc.comb,返回n选择k,是使用gammaln函数实现的。是否有一个保留在日志空间的函数?我看到没有scipy.misc.combln或任何类似的。实现自己是微不足道的,但如果它已经在某个地方的包中会很方便。我没有在scipy.misc中看到它,转换到普通空间然后返回日志感觉很浪费。
答案 0 :(得分:2)
看看the source code,看起来你是对的,实施它是微不足道的,但它可能没有在scipy的其他地方实现。从好的方面来说,有一些错误检查正在进行,所以如果你在其他地方进行这些检查,你可以消除一些(这类似于摆脱指数)。如果您知道自己总是将0 <= k <= N
以及每个k
,N
作为一个数组,那么它将归结为:
from scipy import special
def chooseln(N, k)
return special.gammaln(N+1) - special.gammaln(N-k+1) - special.gammaln(k+1)
答案 1 :(得分:0)
可以使用gammaln
,但N >> k
时减法会丢失精度。
这可以通过与beta函数的关系来避免:
from numpy import log
from scipy.special import betaln
def binomln(n, k):
# Assumes binom(n, k) >= 0
return -betaln(1 + n - k, 1 + k) - log(n + 1)