3

我想logsumexp()在 python 2.7 中使用 numpy。我需要解决的公式如下所示:

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)

我会得到正确的结果。

但现在我必须附加 a -e^ax,因为它是负数,我不能简单地附加axmyarray. 我也不能追加-ax,因为那是错误的,这意味着我要添加1/e^ax,而不是-e^ax.

有什么直接的方法可以附加这个以便我仍然可以使用logsumexp()吗?我坚持使用logsumexp()而不是单独使用numpy.exp()andnumpy.sum()的唯一原因numpy.log()是因为我的印象是logsumexp它还包含稳定性以防止下溢(如果我错了,请纠正我)。但是,如果没有其他办法,那么我想我别无选择。

4

1 回答 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
于 2014-08-30T09:08:35.933 回答