Как упорядочить это вычисление для численной устойчивости?

Я пытаюсь вычислить вектор, сумма которого равна 1 и элементы которого определены как таковые:

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

Проблема в том, что значение экспоненты может быть большим (между -10^2 и 10^2), из-за чего экспонента оценивается как inf или 0.

Я пробовал некоторые варианты, такие как вычитание самого большого элемента или среднего значения tmp из числителя и знаменателя, но этого все еще недостаточно.

По сути, мне нужно преобразование, которое уменьшает среднее значение и дисперсию в tmp, или разумное упорядочение для этого вычисления.

Я использую массивы numpy в качестве контейнеров, а exp — это numpy.exp.


person cpa    schedule 23.04.2012    source источник


Ответы (1)


>>> 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, в котором используется тот же алгоритм.

person Fred Foo    schedule 23.04.2012
comment
Это не то, что сработало для меня, но дало мне некоторые направления в моих исследованиях. Спасибо! - person cpa; 23.04.2012