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。
>>> 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,它使用完全相同的算法。