在 numpy 数组上使用复杂数学计算累积和的 Pythonic 方法

Pythonic way to calculate cumulative sum with complex math over numpy array

我正在执行数据科学并正在计算到达时间泊松分布的对数似然。

def LogLikelihood(arrival_times, _lambda):
  """Calculate the likelihood that _lambda predicts the arrival_times well."""
  ll = 0
  for t in arrival_times:
    ll += -(_lambda) + t*np.log(_lambda) - np.log(factorial(t))
  return ll

数学上,表达式在最后一行:

是否有更 pythonic 的方式来执行此求和?也许在一行中?

在我看来完全是 Pythonic;但是既然 numpy 已经在这里了,为什么不对整个事情进行向量化呢?

return (
    -_lambda
    + arrival_times * np.log(_lambda)
    - np.log(np.vectorize(np.math.factorial)(arrival_times))
).sum()

这对我来说很难看,但适合一行:

def LogLikelihood(arrival_times, _lambda):
    return np.cumsum(list(map(lambda t: -(_lambda) + t*np.log(_lambda) - np.log(factorial(t)),arrival_times)))[-1]

如果您有 scipy 可用,请使用 loggamma,这比链接 logfactorial:

更可靠
from scipy import special

def loglikeli(at,l):
    return (np.log(l)*at-l-special.loggamma(at+1)).sum()

### example 
rng = np.random.default_rng()
at = rng.integers(1,3,10).cumsum()
l = rng.uniform(0,1)

### check against OP's impementation
np.isclose(loglikeli(at,l),LogLikelihood(at,l))
# True