python log n 选择 k

haw*_*kjo 5 python numpy scipy

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

pv.*_*pv. 5

可以使用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)
Run Code Online (Sandbox Code Playgroud)


col*_*oll 4

查看源代码,您似乎是对的,实现起来很简单,但它可能没有在 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)
Run Code Online (Sandbox Code Playgroud)