Переполнение в exp в scipy/numpy в Python?

Что вызывает следующая ошибка:

Warning: overflow encountered in exp

в scipy/numpy с использованием Python обычно означает? Я вычисляю отношение в форме журнала, то есть log (a) + log (b), а затем беря показатель результата, используя exp и используя сумму с logsumexp, следующим образом:

c = log(a) + log(b)
c = c - logsumexp(c)

некоторые значения в массиве b намеренно установлены в 0. Их журнал будет -Inf.

Что может быть причиной этого предупреждения? спасибо.

Ответ 1

В вашем случае это означает, что b очень мал где-то в вашем массиве, и вы получаете число (a/b или exp(log(a) - log(b))), которое слишком велико для любого dtype (float32, float64 и т.д.). ) массив, который вы используете для хранения вывода.

Можно выбрать номер для

  • Игнорировать подобные ошибки,
  • Распечатайте ошибку, но не поднимайте предупреждение, чтобы остановить выполнение (по умолчанию)
  • Запишите ошибку,
  • Поднять предупреждение
  • Поднять ошибку.
  • Вызов пользовательской функции

См. numpy.seterr, чтобы контролировать, как он обрабатывает наличие/переполнение и т.д. в массивах с плавающей запятой.

Ответ 2

Когда вам нужно иметь дело с экспоненциальным, вы быстро переходите в/над потоком, так как функция растет так быстро. Типичным случаем является статистика, где суммирующие экспоненты различной амплитуды довольно распространены. Поскольку числа очень большие/малые, обычно принято, чтобы журнал оставался в "разумном" диапазоне, так называемом домене журнала:

exp(-a) + exp(-b) -> log(exp(-a) + exp(-b))

Проблемы все еще возникают из-за того, что exp (-a) все равно будет переполняться. Например, exp (-1000) уже ниже наименьшего числа, которое вы можете представить как double. Так, например:

log(exp(-1000) + exp(-1000))

дает -inf (log (0 + 0)), хотя вы можете ожидать чего-то вроде -1000 вручную (-1000 + log (2)). Функция logsumexp делает это лучше, извлекая максимум числа и вынимая его из журнала:

log(exp(a) + exp(b)) = m + log(exp(a-m) + exp(b-m))

Это не полностью исключает недоиспользование (если, например, a и b значительно отличаются друг от друга), но он избегает большинства проблем точности в конечном результате

Ответ 3

Не exp(log(a) - log(b)) совпадает с exp(log(a/b)), который совпадает с a/b?

>>> from math import exp, log
>>> exp(log(100) - log(10))
10.000000000000002
>>> exp(log(1000) - log(10))
99.999999999999957

2010-12-07: Если это так, "некоторые значения в массиве b намеренно установлены в 0", то вы по существу делятся на 0. Это звучит как проблема.

Ответ 4

Я думаю, вы можете использовать этот метод для решения этой проблемы:

Нормированная

Я преодолеваю проблему в этом методе. Перед использованием этого метода точность моей классификации составляет: 86%. После использования этого метода точность моей классификации составляет: 96%!!! Это здорово!
первый:
Минимальное масштабирование

Минимальное масштабирование

второй:
Стандартизация Z-балла

Стандартизация Z-оценки

Это обычные методы для реализации normalization.
Я использую первый метод. И я его изменяю. Максимальное число делится на 10. Таким образом, максимальное число результата равно 10. Тогда exp (-10) будет не overflow!
Надеюсь, мой ответ вам поможет! (^ _ ^)

Ответ 5

В моем случае это было связано с большими значениями данных. Я должен был нормализовать (делить на 255, потому что мои данные были связаны с изображениями), чтобы уменьшить значения.