Ошибка переполнения / математического диапазона для журнала или опыта

Строка кода в вопросе:

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))
Другие вопросы по тегам