【问题标题】:Overflow / math range error for log or explog 或 exp 的溢出/数学范围错误
【发布时间】:2016-03-28 18:02:30
【问题描述】:

有问题的代码行:

summing +=  yval * np.log(             sigmoid(np.dot(w.transpose(),xi.transpose()))) 
        +(1-yval)* np.log(max(0.001, 1-sigmoid(np.dot(w.transpose(),xi.transpose()))))

错误:

File "classify.py", line 67, in sigmoid
return 1/(1+ math.exp(-gamma))
OverflowError: math range error

sigmoid 函数就是1/(1+ math.exp(-gamma))

我遇到数学范围错误。有人知道为什么吗?

【问题讨论】:

  • 检查gamma的值。如果-gamma 大于大约 709,您将收到该错误。
  • ...如果不清楚:“为什么”是,exp() 使用很多范围真的很快
  • 有关 scipy 中 sigmoid 函数的一些信息,请参阅 stackoverflow.com/questions/21106134/…

标签: python numpy math overflow


【解决方案1】:

您可以通过对正负伽马使用不同的情况来避免这个问题:

def sigmoid(gamma):
  if gamma < 0:
    return 1 - 1/(1 + math.exp(gamma))
  else:
    return 1/(1 + math.exp(-gamma))

数学范围错误很可能是因为您的gamma 参数是一个很大的负值,所以您调用exp() 时使用了一个很大的正值。这样很容易超出你的浮点范围。

【讨论】:

    【解决方案2】:

    问题是,当gamma 变大时,math.exp(gamma) 会溢出。你可以通过注意这一点来避免这个问题

    sigmoid(x) = 1 / (1 + exp(-x))
               = exp(x) / (exp(x) + 1)
               = 1 - 1 / (1 + exp(x))
               = 1 - sigmoid(-x)
    

    这为您提供了sigmoid 的数值稳定实现,这保证您甚至不会使用正值调用math.exp

    def sigmoid(gamma):
        if gamma < 0:
            return 1 - 1 / (1 + math.exp(gamma))
        return 1 / (1 + math.exp(-gamma))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2014-09-02
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2016-05-23
      • 2017-08-26
      相关资源
      最近更新 更多