在Python中将负数包含在指数和的对数中

3 投票
1 回答
1983 浏览
提问于 2025-04-18 22:54

我想在 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

撰写回答