以python语言计算sigmoid和cost函数为例介绍。
- python的正无穷大,负无穷大
a = float('Inf')
b = np.log(0) #结果为-Inf
-a == b #True
- 计算精度问题
理论上 0.0 < a = sigmoid(z) < 1.0
实际上,对python中的float64类型常量值,
sigmoid(36) == 0.9999999999999998
sigmoid(37) == 1.0
sigmoid(-709) == 1.216780750623423e-308
sigmoid(-710) == 0.0
而在计算代价函数时,需要计算
cost_i = - y*log(a) - (1-y)*log(1-a),由于理论上0.0 < a = sigmoid(z) < 1.0,所以理论上不会出现log(0)的情况。
但在python工程实现时,
出现z>=37时,a为1,log(1-a)就为-Inf,此时,若y为0,则cost_i为Inf
出现z<=710时,a为0,log(a)就为-Inf,此时,若y为1,则cost_i为Inf
此时,样本i是预测错误的,而且错误非常大。但在计算代价时,如果把样本i的代价加入总代价J,则J也将成为Inf。所以,通常计算总代价J时,采用np.nansum(...)来忽略这些极端错误的预测,但实际上,样本i错的程度非常大,而被忽略了。