1

log( exp(A1) + exp(A2) )を計算したいと思います。
以下の式

 log(exp(A1) + exp(A2) ) = log[exp(A1)(1 + exp(A2)/exp(A1))] = A1 + log(1+exp(A2-A1)) 

A1 と A2 が大きく、数値的に exp(A1)=Inf (または exp(A2)=Inf) である場合に便利です。(この式は、このスレッドで説明されています -> コンポーネントの対数項から対数(項の合計) を計算する方法)。A1 と A2 の役割が入れ替わると、式は真になります。

この式の私の懸念は、A1 と A2 が非常に小さい場合です。たとえば、A1 と A2 が次の場合:

 A1 <- -40000
 A2 <- -45000

log(exp(A1) + exp(A2) ) の直接計算は次のとおりです。

 log(exp(A1) + exp(A2))
 [1] -Inf

上記の式を使用すると、次のようになります。

 A1 + log(1 + exp(A2-A1))
 [1] -40000

これは A1 の値です。上記の式を A1 と A2 の反転した役割で計算すると、次のようになります。

A2 + log(1 + exp(A1-A2))
[1] Inf

3 つの値のうち、log(exp(A1) + exp(A2)) の真の値に最も近いのはどれですか? A1、A2が小さい場合とA1、A2が大きい場合の両方で使用できるlog(exp(A1) + exp(A2))を計算する堅牢な方法はありますか?

前もって感謝します

4

2 に答える 2

3

直接計算を行うには、より正確なものを使用する必要があります。

「大きいときに便利」ではありません。差が非常に負の場合に役立ちます。

xが 0 に近い場合、log(1+x)はおよそxです。したがって、 の場合A1>A2、最初の式を取得できます。

log(exp(A1) + exp(A2)) = A1 + log(1+exp(A2-A1))

で近似します(負の値が大きいA1 + exp(A2-A1)ほど、近似は良くなります)。A2-A1であるためA2-A1=-5000、これは十分な近似を行うのに十分な負の数です。

いずれにせよ、yがゼロから遠すぎる場合 (どちらの方法でも) exp(y)、double が (オーバー|アンダー) フローし、0 または無限大になります (これは double ですよね? どの言語を使用していますか?)。これはあなたの答えを説明しています。しかし、exp(A2-A1)=exp(-5000)は 0 に近いので、答えはおよそ-40000+exp(-5000)であり、 と見分けがつかない-40000ので、1 が正しいです。

于 2014-10-18T05:06:40.487 に答える