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

 Смежные вопросы

  • Нет связанных вопросов^_^