2010-11-17 5 views
5

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

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

спасибо.

+0

Вероятность нуля - это особый случай, почему вы считаете, что это то же самое, что и ненулевые вероятности? Почему бы просто не отфильтровать данные из данных и работать с ненулевым? –

+1

Вы дважды проверили, что все значения в распределении действительно положительные? Нет отрицательных значений и нет значений, которые равны нулю? Действительно, небольшие значения не должны иметь значения. –

+0

Такая же проблема, как: http://stackoverflow.com/questions/3704570/in-python-small-floats-tending-to-zero – monkut

ответ

1

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

>>> log(0.0000000000000000000000000001) 
-64.472382603833282 

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

2

Что близко от нуля?

>>> 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) с нулями в результирующем массиве, или только включают в себя точки, которые имеют ненулевую вероятность в массиве вероятности

2

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

eps = 1e-50 
array[array<eps]=eps 
log(array) 
0

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

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