![机器学习编程:从编码到深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/201/38335201/b_38335201.jpg)
5.2.1 信心与疑虑
我将S型函数的计算公式转换为使用Python语言表达的形式,使用NumPy中的exp()函数来实现指数函数的计算,得到如下一个具有单行代码的函数:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/062-2-i.jpg?sign=1738845406-nIRKByMDQUAlanVB2MUd48Uy5Bbxy9PP-0-0353c06ea2bfb53fc42440596a3eade2)
作为一个基于NumPy的函数,sigmoid()函数也使用了NumPy的广播功能,参数z可以是一个数值,也可以是一个多维数组。在第二种情况下,函数将返回一个数组,该数组包含了关于z的所有元素的S型函数。
现在回过头来考察预测部分的代码,我们使用这部分代码来计算输入数据的加权和。原始函数如下:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/062-3-i.jpg?sign=1738845406-fNj1K0Jjc64YdwkrTczdBK0A3l1lx1Wj-0-c1cbe3b072bad819081166246d50d862)
现在修改这个函数,使用sigmoid()函数传递计算结果,具体如下:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/062-4-i.jpg?sign=1738845406-xdIWsxzHKeBsaQZbtOCtizuTYoFlbvYD-0-2a1821e74460b4e34e977849cea1a671)
在本书后续的相关内容中,我们将会看到数据信息在系统中传播的具体过程,通常将该过程称为正向传播。因此,我们将前述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()函数的计算结果四舍五入到它最接近的整数,如下所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/063-i.jpg?sign=1738845406-jwIxlR1oR50xhWmS7pJK0WvikrV8nseV-0-4aa1a05d4f19f402beb1007aad24115c)
我们也可以将上述classify()函数像以前一样命名为predict()函数。在分类情况下,classify和predict这两个单词几乎是同义词。我们选择将该函数命名为classify()是为了强调这样一个事实,由于现在的预测值是一个二进制数值,因此我们要做的事情不再仅仅是线性回归了。
看来我们在分类程序上获得了很大的进展……除了即将面临的一个小困难。