在Python中将负数包含在指数和的对数中
我想在 Python 2.7 中使用 numpy 的 logsumexp()
函数。我要解决的公式看起来是这样的:
log ( 1 + e^a1 + e^a2 + e^a3 + ... e^an - e^ax )
最后一个项是个负数,只需要把它加上去就行。除了这个最后的项,我会这样做:
myarray = numpy.array([0, a1, a2, a3, ..., an])
这样的话,第一项是 0
,那么 e^0 = 1
,所以我的第一项就是 1
。接下来我只需要使用
result = numpy.logsumexp(myarray)
这样就能得到正确的结果。
但是现在我需要加上一个 -e^ax
,因为它是负数,我不能简单地把 ax
加到 myarray
的末尾。我也不能加 -ax
,因为那样是不对的,这样会变成我在加 1/e^ax
,而不是 -e^ax
。
有没有什么直接的方法可以加上这个项,这样我还能继续使用 logsumexp()
?我之所以坚持使用 logsumexp()
,而不是单独使用 numpy.exp()
、numpy.sum()
和 numpy.log()
,是因为我觉得 logsumexp
还考虑了稳定性,以防止出现下溢(如果我错了请纠正我)。不过如果没有其他办法,那我想我也没办法了。
1 个回答
5
根据 scipy.misc.logsumexp
的 文档:
scipy.misc.logsumexp(a, axis=None, b=None) Parameters: b: array-like, optional Scaling factor for exp(a). Must be of the same shape as a or broadcastable to a. New in version 0.12.0.
所以,你可以像这样添加一系列的因素:
In [2]: a = [0, 1, 3, 2]
In [3]: logsumexp(a, b=[1] * (len(a) - 1) + [-1])
Out[3]: 2.7981810916785101