2015-02-16 3 views
1

У меня есть выражение, как показано ниже, где данные - это матрица и theta - вектор, python постоянно повышает деление на 0 ошибок. Но только знаменатель (1 + е^х), каждый элемент этой матрицы не может быть 0 все равноNumpy в какой ситуации вернется «Divide by zero error»?

np.sum(-data[:,-1]*np.log(1.0/(1.0+np.exp(-np.dot(data[:,:-1],theta.transpose()))))) 

Есть ли повод я проигнорировала, который будет генерировать эту ошибку?

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

+0

Возможно ли, что либо 'theta', либо' data [:,: - 1] 'содержит комплексные числа? (Вряд ли, так как это похоже на ручную реализацию логистической регрессии, но может быть?) – ely

+0

Это не должно происходить из ошибочного большого отрицательного числа, так как 'np.log (0)' дает 'inf' и не поднимает ошибка деления на нуль. Можете ли вы напечатать небольшую часть того, как выглядят данные в 'тета' и' data [:,: -1] '? – ely

+0

'np.log (0)' дает предупреждение 'RuntimeWarning: деление на ноль, встречающееся в журнале, и возвращает' -inf' (с использованием numpy 1.9.1). –

ответ

0

Из сообщения об ошибке приведены в комментариях к вопросу:

py:21: RuntimeWarning: divide by zero encountered in log return (np.sum(-data[:,-1]*np.log(1.0/(1.0+np.exp(-np.dot(data[:,:-1],theta.transpose()‌​))))-(1-data[:,-1])*np.log(1-1.0/(1.0+np.exp(-np.dot(data[:,:-1],theta.transpose(‌​))))))+np.sum(theta[1:]**2)*lamda/2.0)*1.0/data.shape[0] 

оказывается, что вы вычисления np.log(0). Например.

>>> import numpy as np 
>>> np.log(0) 
__main__:1: RuntimeWarning: divide by zero encountered in log 
-inf 
>>> 

И это, вероятно, происходит потому, что np.exp(...) переполнен, или 1.0 + np.exp(...) возвращается 1,0 (потому что np.exp(...) меньше, чем «машины эпсилон»), и вы вычисления np.log(1.0 - 1.0/(1.0 + np.exp(...))).