5.2.1 信心与疑虑
我将S型函数的计算公式转换为使用Python语言表达的形式,使用NumPy中的exp()函数来实现指数函数的计算,得到如下一个具有单行代码的函数:
作为一个基于NumPy的函数,sigmoid()函数也使用了NumPy的广播功能,参数z可以是一个数值,也可以是一个多维数组。在第二种情况下,函数将返回一个数组,该数组包含了关于z的所有元素的S型函数。
现在回过头来考察预测部分的代码,我们使用这部分代码来计算输入数据的加权和。原始函数如下:
现在修改这个函数,使用sigmoid()函数传递计算结果,具体如下:
在本书后续的相关内容中,我们将会看到数据信息在系统中传播的具体过程,通常将该过程称为正向传播。因此,我们将前述predict()函数重新命名为forward()函数。
forward()函数的计算结果是我们的预测值yyy.jpg,它是相同维度矩阵的加权和,每一行为一个样本,每一列为一个权重。只是矩阵中的每个元素的取值现在都被限制在0和1之间罢了。
直观地说,你可以将y_hat的取值视为或多或少有点确定的预测结果。如果y_hat的取值接近于极端值,如0.01或0.98,则是一个非常有信心的预测结果。如果y_hat的取值接近中间值,如0.51,则是一个非常不确定的预测结果。
在训练阶段,这种信心的逐渐变化正是我们所需要的结果。我们希望损失函数值能够平稳地变化,这样就可以使用梯度下降法在它上面滑动。但是,一旦我们从训练阶段切换到分类阶段,就不希望系统再拐弯抹角的了。因为我们用于训练分类器的样本标签是0或1,所以分类器的输出结果也应该是0或1。为了得到明确的答案,我们可以在分类阶段使用classify()函数将forward()函数的计算结果四舍五入到它最接近的整数,如下所示:
我们也可以将上述classify()函数像以前一样命名为predict()函数。在分类情况下,classify和predict这两个单词几乎是同义词。我们选择将该函数命名为classify()是为了强调这样一个事实,由于现在的预测值是一个二进制数值,因此我们要做的事情不再仅仅是线性回归了。
看来我们在分类程序上获得了很大的进展……除了即将面临的一个小困难。