Обработка переполнения numpy.exp при использовании функции в 2d-массиве

#python #numpy #exponentiation #sigmoid

#python #numpy #возведение в степень #сигмоид

Вопрос:

У меня есть 2d-массив numpy, для которого я хочу использовать свою функцию sigmoid (x), которая:

     def sigmoid(x):
        return 1 / (1   np.exp(-x))
 

Моя проблема в том, что у меня слишком большие входные данные, например 3000, и я получаю это предупреждение:

 RuntimeWarning: overflow encountered in exp
  return 1 / (1   np.exp(-x/8.))
 

Я пытался просто присваивать значения входным данным по определенному числу, например 700 -> 1 и -700 -> 0, однако это очень медленно, потому что мне приходится перебирать весь массив таким образом.

Я также изучил np.logandexp(x1, x2) , но не могу заставить его работать…

Редактировать: тип данных — float64 кстати

Комментарии:

1. Что dtype такое ваш массив?

2. Тип данных — float64

3. Почему бы не использовать scipy.special.expit ? В качестве альтернативы, игнорируйте или подавляйте предупреждения; они безвредны, поскольку вы все равно должны получать правильный результат с плавающей запятой.

Ответ №1:

Вы можете использовать функцию SciPy expit() , которая довольно хорошо себя ведет:

 In [114]: from scipy.special import expit

# sample input array
In [115]: x = np.arange(50000, dtype=np.float64)

In [116]: sigm = expit(x)

# sanity check for no `np.inf`
In [117]: expit(70000.0)
Out[117]: 1.0
 

Ответ №2:

Вы можете преобразовать свой ввод в пространство журнала и запустить sigmoid после, это значительно уменьшит большие значения.