如何为数值稳定性订购此计算?

时间:2012-04-23 09:33:13

标签: python numpy numerical exponential stability

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

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

问题是指数中的值可能很大(在-10 ^ 2到10 ^ 2之间),使得指数可以评估为inf或0。

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

基本上,我需要进行转换,以减少tmp中的平均值和色散,或者为此计算提供一个巧妙的排序。

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

1 个答案:

答案 0 :(得分:3)

>>> 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,它使用exact same algorithm