Мне нужно вычислить экспоненту следующего массива для моего проекта:
w = [-1.52820754859, -0.000234000845064, -0.00527938881237, 5797.19232191, -6.64682108484,
18924.7087966, -69.308158911, 1.1158892974, 1.04454511882, 116.795573742]
Но у меня было переполнение из-за номера 18924.7087966.
Цель состоит в том, чтобы избежать использования дополнительных пакетов, таких как bigfloat (кроме «numpy»), и получить близкий результат (который имеет небольшую относительную ошибку).
1. До сих пор я пытался использовать более высокую точность (например, float128):
def getlogZ_robust(w):
Z = sum(np.exp(np.dot(x,w).astype(np.float128)) for x in iter_all_observations())
return np.log(Z)
Но я все еще получаю «информацию», чего я хочу избежать.
Я попытался обрезать его с помощью nump.clip():
def getlogZ_robust(w): Z = sum(np.exp(np.clip(np.dot(x,w).astype(np.float128),-11000, 11000)) for x in iter_all_observations()) return np.log(Z)
Но относительная ошибка слишком велика.
Можете ли вы помочь мне решить эту проблему, если это возможно?
logsumexp
. Если нет, вы можете получить исходный код с github.com/ scipy/scipy/blob/master/scipy/special/_logsumexp.py или немного поискать здесь, в stackoverflow. Вероятно, существует множество реализаций одного и того же метода, разбросанных по ответам stackoverflow. - person Warren Weckesser   schedule 10.11.2019