当我这样做时:
summing += yval * np.log(sigmoid(np.dot(w.transpose(), xi.transpose()))) + (1-yval)* np.log(1-sigmoid(np.dot(w.transpose(), xi.transpose())))
如果没有除法,为什么我会在log"中遇到"除以零?错误?因此,summing
变为[nan]
。
答案 0 :(得分:25)
当您尝试使用0评估日志时出现的错误:
>>> import numpy as np
>>> np.log(0)
__main__:1: RuntimeWarning: divide by zero encountered in log
我同意它不是很清楚。
所以在你的情况下,我会检查为什么你的日志输入是0。
PS:这是numpy 1.10.4
答案 1 :(得分:13)
我有同样的问题。看起来你正在尝试进行逻辑回归。我正在使用逻辑回归进行MULTI-CLASS分类。但是你需要使用ONE VS ALL方法解决这个问题(google了解详情)。
如果你没有设置你的yval变量,只有'1'和'0'而不是yval = [1,2,3,4,...]等,那么你会得到负成本导致失控的theta然后导致你达到log(y)的极限,其中y接近于零。
修复应该是预处理你的yval变量,使它只有'1'和'0'表示正面和负面的例子。
答案 2 :(得分:2)
即使已经很晚了,这个答案也可能会帮助别人。
在代码部分。
... + (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)中的Sigmoid函数将返回1.
。
看您的实现,看来您正在处理Logistic回归算法,在这种情况下(我的印象是)功能扩展非常重要。
自从我第一次写答案以来,如果我想道歉的话,我可能违反了一些规则/规定。
答案 3 :(得分:0)
尝试将一个非常小的值(例如1e-7)添加到输入中。例如,sklearn库的log_loss函数具有参数eps
。
https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/48701