"Разделить на ноль, встречающееся в журнале", когда не делить на ноль
Когда я делаю:
summing += yval * np.log(sigmoid(np.dot(w.transpose(), xi.transpose()))) + (1-yval)* np.log(1-sigmoid(np.dot(w.transpose(), xi.transpose())))
где нет деления, почему я получаю ошибку "деление на ноль, встречающееся в журнале"? В результате summing
становится [nan]
.
Ответы
Ответ 1
Это предупреждение вы получаете, когда пытаетесь оценить лог с 0:
>>> import numpy as np
>>> np.log(0)
__main__:1: RuntimeWarning: divide by zero encountered in log
Я согласен, это не очень понятно.
Так что в вашем случае я бы проверил, почему ваш вход в лог равен 0.
PS: это на NumPy 1.10.4
Ответ 2
У меня была такая же проблема. Похоже, вы пытаетесь сделать логистическую регрессию. Я выполнял классификацию MULTI-CLASS с логистической регрессией. Но вам нужно решить эту проблему, используя подход ONE VS ALL (подробнее см. Google).
Если вы не устанавливаете свою переменную yval так, чтобы только 1 и 0 вместо yval = [1,2,3,4,...] и т.д., Тогда вы получите отрицательные затраты, которые приведут к побегу тета, а затем привести к достижению предела log (y), где y близко к нулю.
Исправление должно состоять в том, чтобы предварительно обработать вашу переменную yval, чтобы она имела только "1" и "0" для положительных и отрицательных примеров.
Ответ 3
Хотя уже поздно, этот ответ может помочь кому-то еще.
В части вашего кода.
... + (1-yval)* np.log(1-sigmoid(np.dot(w.transpose(), xi.transpose())))
может быть, np.dot(w.transpose(), xi.transpose())
выплевывает большие значения (больше 40 или около того), в результате чего sigmoid( )
будет иметь значение 1
. И тогда вы в основном берете np.log
1-1
который равен 0
. И, как DevShark упомянул выше, он вызывает RuntimeWarning: Divide by zero...
Как я придумал число 40, вы можете спросить, ну, это просто, что для значений выше 40 или около того сигмоидальная функция в python (numpy) возвращает 1.
..
Глядя на вашу реализацию, кажется, что вы имеете дело с алгоритмом логистической регрессии, и в этом случае (мне кажется, что) масштабирование функций очень важно.
Поскольку я пишу ответ в первый раз, возможно, я нарушил некоторые правила/положения, если бы я хотел извиниться.
Ответ 4
Попробуйте добавить к входу очень маленькое значение, например, 1e-7. Например, библиотека sklearn имеет параметр eps
для функции log_loss.
https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/48701