Ошибка переполнения / математического диапазона для журнала или опыта
Строка кода в вопросе:
summing += yval * np.log( sigmoid(np.dot(w.transpose(),xi.transpose())))
+(1-yval)* np.log(max(0.001, 1-sigmoid(np.dot(w.transpose(),xi.transpose()))))
Ошибка:
File "classify.py", line 67, in sigmoid
return 1/(1+ math.exp(-gamma))
OverflowError: math range error
Сигмовидная функция просто 1/(1+ math.exp(-gamma))
,
Я получаю ошибку математического диапазона. Кто-нибудь видит почему?
2 ответа
Вы можете избежать этой проблемы, используя разные случаи для положительной и отрицательной гаммы:
def sigmoid(gamma):
if gamma < 0:
return 1 - 1/(1 + math.exp(gamma))
else:
return 1/(1 + math.exp(-gamma))
Ошибка математического диапазона, вероятно, потому что ваш gamma
Аргумент является большим отрицательным значением, поэтому вы звоните exp()
с большим положительным значением. Таким образом, очень легко превысить диапазон с плавающей запятой.
Проблема в том, что когда gamma
становится большим, math.exp(gamma)
переполняется. Вы можете избежать этой проблемы, заметив, что
sigmoid(x) = 1 / (1 + exp(-x))
= exp(x) / (exp(x) + 1)
= 1 - 1 / (1 + exp(x))
= 1 - sigmoid(-x)
Это дает вам численно стабильную реализацию sigmoid
что гарантирует вам никогда не звонить math.exp
с положительным значением:
def sigmoid(gamma):
if gamma < 0:
return 1 - 1 / (1 + math.exp(gamma))
return 1 / (1 + math.exp(-gamma))