Переполнение в 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, потому что мои данные были связаны с изображениями), чтобы уменьшить значения.