Использование np.expm1 для вычисления сигмоидальной функции - PullRequest
0 голосов
/ 25 апреля 2018

При вычислении сигмоидной функции малые или большие значения x будут возвращать 0 и 1 соответственно из-за отсутствия точности с плавающей запятой. В numpy функция np.expm1 будет вычислять exp(x)-1 с большей точностью для экстремальных значений x. Однако эквивалентная функция для вычисления exp(x)+1 (знаменатель в сигмоидальной функции) не существует. Я не мог понять, как использовать np.expm1 для вычисления сигмоида с повышенной точностью при экстремальных значениях. Есть ли способ сделать это?

1/(np.exp(-20)+1)==1.0
#False
1/(np.exp(-50)+1)==1.0
# True

1 Ответ

0 голосов
/ 25 апреля 2018

np.expm1 смягчает потерю значимости , которая происходит, когда берется разница между двумя почти равными числами (поскольку многие значимые места взаимно отменяют друг друга, результат будет иметь меньше значащих мест, чем может хранить тип данных).

1/(np.exp(-50)+1)==1.0

- это ограничение типа данных, а не алгоритма.floats не может разрешить разницу с 1.0, равную exp(-50).В самом деле, ближайшие значения с плавающей точкой слева и справа от 1.0 равны

>>> np.nextafter(1.0, 0.0)
0.9999999999999999
>>> np.nextafter(1.0, 2.0)
1.0000000000000002

, указывающим разрешение oom 10^-16, нигде не достаточно хорошо, чтобы различать 1 и 1 +/- exp(-50)

...