2016-03-28 5 views
3

Zeile Code in Frage:Überlauf/math Bereichsfehler für log oder exp

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())))) 

Fehler:

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

Die Sigmoidfunktion ist nur 1/(1+ math.exp(-gamma)).

Ich bekomme einen mathematischen Bereichsfehler. Wer sieht warum?

+2

Überprüfen Sie den Wert von 'gamma'. Wenn "-gamma" größer als etwa 709 ist, erhalten Sie diesen Fehler. –

+0

... und falls es unklar ist: das "warum" ist, exp() verwendet eine große Bandbreite sehr schnell – comingstorm

+0

Siehe http://stackoverflow.com/questions/21106134/numpy-pure-functions-for-performance- Caching/21106536 # 21106536 für einige Informationen über die Sigmoid-Funktion in scipy. –

Antwort

4

können Sie dieses Problem vermeiden, indem verschiedene Fälle für positive und negative Gamma mit:

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

Der Mathematik-Bereichsfehler wahrscheinlich ist, weil Ihr gamma Argument ein großer negativer Wert ist, so dass Sie exp() mit einem großen fordern positiver Wert. Es ist sehr einfach, Ihren Gleitkommabereich auf diese Weise zu überschreiten.

2

Das Problem ist, dass, wenn gamma wird groß, math.exp(gamma) überläuft. Sie können dieses Problem vermeiden, indem Sie bemerken, dass

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

Dies Sie eine numerisch stabile Implementierung von sigmoid gibt, die garantiert Ihnen nie math.exp rufen sogar mit einem positiven Wert:

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