当我这样做时:
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]
。
这是当您尝试使用0:评估日志时收到的警告
>>> import numpy as np
>>> np.log(0)
__main__:1: RuntimeWarning: divide by zero encountered in log
我同意这不是很清楚。
因此,在您的情况下,我会检查为什么您对日志的输入为0。
PS:这是在numpy 1.10.4 上
我也遇到了同样的问题。看起来你正试图进行逻辑回归。我在用逻辑回归进行多类分类。但您需要使用ONE VS ALL方法来解决这个问题(详细信息请在谷歌上搜索)。
如果你不设置yval变量,使其只有"1"one_answers"0",而不是yval=[1,2,3,4,…]等,那么你会得到负成本,这会导致θ失控,然后导致你达到log(y)的极限,其中y接近零。
修复方法应该是对yval变量进行预处理,使其仅具有"1"one_answers"0"作为正负示例。
即使已经很晚了,这个答案也可能对其他人有所帮助。
在代码的部分。
... + (1-yval)* np.log(1-sigmoid(np.dot(w.transpose(), xi.transpose())))
可能是np.dot(w.transpose(), xi.transpose())
函数吐出较大的值(大于40左右),导致sigmoid( )
的输出为1
。然后你基本上取1-1
的np.log
,也就是0
。正如DevShark上面提到的,它会导致RuntimeWarning: Divide by zero...
错误。
你可能会问,我是如何得出数字40的,只是对于超过40的值,python(numpy)中的sigmoid函数返回1.
。
从您的实现来看,您似乎在处理逻辑回归算法,在这种情况下(我认为)特征缩放非常重要。
由于我是第一次写答案,我可能违反了一些规则/规定,如果是这样的话,我想道歉。
尝试在输入中添加一个非常小的值,例如1e-7。例如,sklearn库有一个用于log_loss函数的参数eps
。
https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/48701