#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 после, это значительно уменьшит большие значения.