不除以零时的"Divide by zero encountered in log"



当我这样做时:

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

相关内容

最新更新