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])

このように、最初の要素が0e^0 = 1あると、最初の項である が得られ1ます。それから私はただ使用します

  result = numpy.logsumexp(myarray)

正しい結果が得られます。

しかし、今は a を追加する必要が-e^axあり、それが負であるため、単に.axの最後に追加することはできませんmyarray-axそれはちょうど間違っているので、追加することもできませ1/e^ax-e^ax

これを追加して引き続き使用できるようにする直接的な方法はありますlogsumexp()か? andをlogsumexp()個別に使用するのではなく、使用することを主張している唯一の理由は、アンダーフローを防ぐために安定性も組み込んでいるという印象があるためです (間違っていたら訂正してください)。でも、それしか方法がないのなら仕方がないと思います。numpy.exp()numpy.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 に答える