由於fuglede說,這裏的問題是,np.float64
無法處理一些大如exp(1234.1)
。嘗試使用代替:
>>> cc = np.array([[0.120,0.34,-1234.1]], dtype=np.float128)
>>> cc
array([[ 0.12, 0.34, -1234.1]], dtype=float128)
>>> 1/(1 + np.exp(-cc))
array([[ 0.52996405, 0.58419052, 1.0893812e-536]], dtype=float128)
不過請注意,有使用擴展精度一定的怪癖。它可能不適用於Windows;你實際上並沒有獲得完整的128位精度;當數字通過純粹的python時,你可能會失去精度。你可以閱讀更多關於細節here。
對於大多數實際用途,您可能大致將1/(1 + <a large number>)
近似爲零。也就是說,只要忽略警告並繼續前進即可。 numpy的照顧近似的你(使用np.float64
時):
>>> 1/(1 + np.exp(-cc))
/usr/local/bin/ipython3:1: RuntimeWarning: overflow encountered in exp
#!/usr/local/bin/python3.4
array([[ 0.52996405, 0.58419052, 0. ]])
如果你想取消此警告,您可以使用scipy.special.expit
,由WarrenWeckesser到問題的評論所說:
>>> from scipy.special import expit
>>> expit(cc)
array([[ 0.52996405, 0.58419052, 0. ]])
對於S形函數的討論,見我的回答在http://stackoverflow.com/questions/21106134/numpy-pure性能緩存(TL; DR:Use ['scipy.special.expit']](https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.expit.html) ) –