在 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
,这比链接 log
和 factorial
:
更可靠
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
我正在执行数据科学并正在计算到达时间泊松分布的对数似然。
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
,这比链接 log
和 factorial
:
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