"Разделить на ноль, встречающееся в журнале", когда не делить на ноль

Когда я делаю:

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...

Глядя на вашу реализацию, кажется, что вы имеете дело с алгоритмом логистической регрессии, и в этом случае (мне кажется, что) масштабирование функций очень важно.

Поскольку я пишу ответ в первый раз, возможно, я нарушил некоторые правила/положения, если бы я хотел извиниться.