2

合計が1で、要素が次のように定義されているベクトルを計算しようとしています。

v[i] = exp(tmp[i])/exp(tmp).sum()

問題は、指数の値が大きく(-10^2から10^2の間)、指数がinfまたは0と評価される可能性があることです。

最大の要素やtmpの平均を分子と分母に差し引くなど、いくつかのバリエーションを試しましたが、それでも十分ではありません。

基本的に、平均値とtmpの分散を減らす変換、またはこの計算の巧妙な順序付けが必要です。

コンテナとしてnumpy配列を使用しており、expはnumpy.expです。

4

1 に答える 1

4
>>> tmp = np.array([-10**10, 10**10])
>>> tmp_max = tmp.max()
>>> log_D = log(sum(exp(tmp - tmp_max))) + tmp_max
>>> log_v = tmp - log_D
>>> v = np.exp(log_v)
>>> v
array([ 0.,  1.])

またはscipy.misc.logsumexpまったく同じアルゴリズムを使用する を使用します。

于 2012-04-23T09:55:14.600 に答える