2012-04-23 57 views
2

我试图计算的矢量,其总和为1,并且其元素被定义为这样:如何订购这种计算数值稳定性?

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

的问题是,在指数的值可以是大的(-10和之间^ 2 10^2),使指数评估为inf或0.

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

基本上,我需要一个转换,它可以减少tmp中的平均值和离散度,或者降低计算的巧妙排序。

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

回答

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

+0

这不是我的工作,但它给了我在我的调查中的一些方向。谢谢! – cpa 2012-04-23 12:33:39