2012-04-23 49 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