如何安排此计算以获得数值稳定性?

cpa*_*cpa 3 python numerical numpy stability exponential

我正在尝试计算一个向量,其总和为 1,其元素定义如下:

v[i] = exp(tmp[i])/exp(tmp).sum()
Run Code Online (Sandbox Code Playgroud)

问题是指数中的值可能很大(在 -10^2 和 10^2 之间),使得指数计算结果为 inf 或 0。

我尝试了一些变体,例如用分子和分母减去最大元素或 tmp 的平均值,但这仍然不够。

基本上,我需要一种减少 tmp 中平均值和离散度的转换,或者对此计算的巧妙排序。

我使用 numpy 数组作为容器,exp 是 numpy.exp。

Fre*_*Foo 5

>>> 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.])
Run Code Online (Sandbox Code Playgroud)

或者使用scipy.misc.logsumexp,它使用完全相同的算法。