【问题标题】:"Divide by zero encountered in log" when not dividing by zero不除以零时“在日志中遇到除以零”
【发布时间】:2016-07-13 18:20:42
【问题描述】:

当我这样做时:

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]

【问题讨论】:

  • 您可能应该将该语句分成多行。理解发生了什么非常困难,这将使调试变得更容易。

标签: python numpy


【解决方案1】:

这是您尝试使用 0 评估日志时收到的警告:

>>> import numpy as np
>>> np.log(0)
__main__:1: RuntimeWarning: divide by zero encountered in log

我同意这不是很清楚。

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

PS:这是在 numpy 1.10.4 上

【讨论】:

  • 什么版本?我得到-inf。
  • @Reti43:这只是一个警告,而不是例外。它返回-inf,但仍显示警告。
  • 这是在 numpy 1.10.4 上。
  • 很公平。我在 1.10.0,它没有给出任何警告。
  • @Reti43:可能只是您已经收到了一次警告,而 Python 没有在同一个会话中再次发出警告。它可能会再次出现在新的口译员中。 (我没有要检查的 numpy 1.10.0 安装。)
【解决方案2】:

我遇到了同样的问题。看起来您正在尝试进行逻辑回归。我正在使用逻辑回归进行多类分类。但是您需要使用 ONE VS ALL 方法来解决这个问题(详情请谷歌)。

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

解决方法应该是预处理您的 yval 变量,使其只有 '1' 和 '0' 用于正例和负例。

【讨论】:

  • 非常感谢您的评论
  • 非常感谢!
【解决方案3】:

即使为时已晚,此答案也可能对其他人有所帮助。

在您的代码部分。

... + (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.

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

由于我是第一次写答案,我可能违反了一些规则/规定,如果是这样我想道歉。

【讨论】:

    【解决方案4】:

    尝试在输入中添加一个非常小的值,例如 1e-7。例如,sklearn 库有一个参数eps 用于 log_loss 函数。

    https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/48701

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多