我正在尝试计算一个向量,其总和为 1,其元素定义如下:
v[i] = exp(tmp[i])/exp(tmp).sum()
问题是指数中的值可能很大(介于 -10^2 和 10^2 之间),使得指数评估为 inf 或 0。
我尝试了一些变化,例如将最大元素或 tmp 的平均值减去分子和分母,但仍然不够。
基本上,我需要一个减少平均值和 tmp 离散度的转换,或者这个计算的巧妙排序。
我使用 numpy 数组作为容器,exp 是 numpy.exp。
我正在尝试计算一个向量,其总和为 1,其元素定义如下:
v[i] = exp(tmp[i])/exp(tmp).sum()
问题是指数中的值可能很大(介于 -10^2 和 10^2 之间),使得指数评估为 inf 或 0。
我尝试了一些变化,例如将最大元素或 tmp 的平均值减去分子和分母,但仍然不够。
基本上,我需要一个减少平均值和 tmp 离散度的转换,或者这个计算的巧妙排序。
我使用 numpy 数组作为容器,exp 是 numpy.exp。
>>> 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
,它使用完全相同的算法。