"在log"中遇到零除以什么时候不除零

时间:2016-03-25 22:53:08

标签: python numpy

当我这样做时:

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]

4 个答案:

答案 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