ведение журнала очень маленьких значений с использованием numpy / scipy в Python - PullRequest
5 голосов
/ 17 ноября 2010

У меня есть массив Nx1, который соответствует распределению вероятностей, т. Е. Сумма элементов равна 1. Это представляется как обычный массив с нулевыми значениями. Поскольку N может быть относительно большим, например, 10 или 20, многие из отдельных элементов довольно близки к 0. Я обнаружил, что когда я беру log (my_array), я получаю ошибку «FloatingPointError: недопустимое значение, обнаруженное в журнале». Обратите внимание, что это после преднамеренной установки seterr (invalid = 'поднимать') в numpy.

Как я могу справиться с этой числовой проблемой? Я хотел бы представить векторы, соответствующие распределению вероятностей и их журналу взятия без округления до 0, с тех пор я заканчиваю тем, что взял log (0), что вызывает ошибку.

спасибо.

Ответы [ 4 ]

3 голосов
/ 17 ноября 2010

Вы можете просто отбросить хвосты в соответствии с необходимой точностью.

eps = 1e-50
array[array<eps]=eps
log(array)
2 голосов
/ 17 ноября 2010

Что довольно близко к нулю?

>>> np.log(0)
-inf
>>> 0.*np.log(0)
nan
>>> np.log(1e-200)
-460.51701859880916
>>> 1e-200*np.log(1e-200)
-4.6051701859880914e-198

Одним из решений является добавление небольшого положительного числа ко всем вероятностям, чтобы ограничить их достаточным удалением от нуля.

Второе решение заключается в явной обработке нулей, например, заменить 0. * np.log (0) нулями в результирующем массиве или включить только точки, которые имеют ненулевую вероятность в массиве вероятностей

1 голос
/ 17 ноября 2010

Насколько они «близки» к 0?Кажется, Python счастлив, принимая журнал 10 ^ - очень большой:

>>> log(0.0000000000000000000000000001)
-64.472382603833282

Кроме того, почему вы берете журналы?Что вы планируете делать с ними после того, как вы их взяли?

0 голосов
/ 17 ноября 2010

В зависимости от того, что вы делаете потом, вы можете использовать другое преобразование, которое не взрывается при нулевых значениях, как журнал.Возможно, сигмовидная функция или что-то еще с четко определенным якобианом.

Если вы просто хотите визуализировать данные, вы всегда можете добавить какое-то крошечное значение, прежде чем брать журнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...