不除以零时"在日志中遇到零除"

Job*_*obs 12 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())))
Run Code Online (Sandbox Code Playgroud)

在没有除法的情况下,为什么我会得到"在日志中遇到零除"错误?结果,summing变成了[nan].

Dev*_*ark 29

这是您尝试使用0评估日志时得到的错误:

>>> import numpy as np
>>> np.log(0)
__main__:1: RuntimeWarning: divide by zero encountered in log
Run Code Online (Sandbox Code Playgroud)

我同意它不是很清楚.

所以在你的情况下,我会检查为什么你的日志输入是0.

PS:这是numpy 1.10.4

  • @ Reti43:这只是一个警告,不是例外.它返回`-inf`,但它仍然显示警告. (5认同)

小智 13

我有同样的问题.看起来你正在尝试进行逻辑回归.我正在使用逻辑回归进行MULTI-CLASS分类.但是你需要使用ONE VS ALL方法解决这个问题(google了解详情).

如果你没有设置你的yval变量,只有'1'和'0'而不是yval = [1,2,3,4,...]等,那么你将得到导致失控的负成本theta然后导致你达到log(y)的极限,其中y接近于零.

修复应该是预处理你的yval变量,使它只有'1'和'0'表示正面和负面的例子.


小智 6

即使太晚了,这个答案也可能会帮助别人。

在您的代码部分。

... + (1-yval)* np.log(1-sigmoid(np.dot(w.transpose(), xi.transpose())))
Run Code Online (Sandbox Code Playgroud)

可以是np.dot(w.transpose(), xi.transpose())功能吐痰较大的值(高于40左右),从而产生的输出sigmoid( )1。然后,你基本上采取np.log1-10。而且正如DevShark上面提到的,它会导致RuntimeWarning: Divide by zero...错误。

您可能会问我如何得出数字40,好吧,对于大于40左右的值,python(numpy)return中的sigmoid函数1.

查看您的实现,看来您正在处理Logistic回归算法,在这种情况下(我印象中)特征缩放非常重要

自从我第一次写答案以来,如果我想道歉的话,可能我违反了一些规则/规定。