python log n选择k

时间:2014-02-13 23:18:01

标签: python numpy scipy

scipy.misc.comb,返回n选择k,是使用gammaln函数实现的。是否有一个保留在日志空间的函数?我看到没有scipy.misc.combln或任何类似的。实现自己是微不足道的,但如果它已经在某个地方的包中会很方便。我没有在scipy.misc中看到它,转换到普通空间然后返回日志感觉很浪费。

2 个答案:

答案 0 :(得分:2)

看看the source code,看起来你是对的,实施它是微不足道的,但它可能没有在scipy的其他地方实现。从好的方面来说,有一些错误检查正在进行,所以如果你在其他地方进行这些检查,你可以消除一些(这类似于摆脱指数)。如果您知道自己总是将0 <= k <= N以及每个kN作为一个数组,那么它将归结为:

    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)