![机器学习编程:从编码到深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/201/38335201/b_38335201.jpg)
2.2.4 计算误差
可以使用这样的一种策略来寻找最接近样本数据的一条直线。想象一下,如果有一个关于样本数据(X和Y)和直线(w)的函数,用于测量这直线与样本数据之间的误差。直线越接近样本,误差值就越小。如果我们有这样一个函数,那么就可以使用这个函数来计算很多条直线,直到找到一条误差足够小的直线。
除了“误差”这个名字,机器学习研究人员还给这个函数起了另外一个名字,叫作损失。
我们可以这样表示一个损失函数。假设获得一个随机值w,如1.5。可以使用这个w进行预测,如果有14个座位预订数,那么能够卖出多少个比萨呢?调用函数predict(14,1.5),可得块比萨。
但是,这里有一个关键要点:这个预测值并不与Roberto文件中的实际值相匹配。回头看看前几个样本数据:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/019-2-i.jpg?sign=1738828965-kEqCMCkxpZjl2zs5DV6ewyISelOByzKZ-0-b5549df42a6d1dc2f78f1d54eaa404ed)
某天晚上有14个座位预订数,那天晚上Roberto卖出了32个比萨,而非21个。因此,可以算出相应的误差。这个误差值就是预测值与实际值之间的差值,即下图中的加粗线段:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/019-4-i.jpg?sign=1738828965-EhlDLL2LjvqIL9AcrEPhtOZncPXqZX9v-0-bfe1f27d333976ea3d4dc38d1f2402b9)
下面是在代码中计算的样子:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/020-i.jpg?sign=1738828965-zb7Fm71LwXIlco2e3ifuT05BqbISNdyq-0-71cf80ba5538333c82142d80ee86353f)
上面的计算有一个小问题:误差可以是零、正的或者负的。然而,误差值应该总是正的。如果你把多个误差加在一起,肯定不会想让两个异号的误差相加变成一个对的。为保证误差值总是正的,我们对其做如下平方运算:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/020-2-i.jpg?sign=1738828965-9AsSejnTUtnVyFWAG4MoAtJOSGo8bDoz-0-3a3abc6e3f1c41377ec30fecca0b160c)
其实我们也可以用误差的绝对值来代替平方。然而,使用误差的平方会有一些额外的好处。这些好处在下一章中就会变得很明显。
现在我们对所有样本数据的平方误差求平均值,瞧!我们终于得到了损失函数。这种计算损失的方法称为均方误差法,在统计学家中很流行。下面是关于均方误差的代码:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/020-3-i.jpg?sign=1738828965-Rmth5CmITr22cwXudMtFAyfYH1xcPqjQ-0-6bdd9b277a4f4520ab360b61ebcc9b57)
还记得我们使用NumPy加载数组X和Y吗?这两个变量都是NumPy数组,因此代码非常简洁。在loss()函数的第一行中,我们将数组X中的每个元素都乘以w,得到一个预测数组;对于每一个预测值,我们相应地计算误差——预测和实际标签之间的差异;使用幂运算符算出每个误差的平方;最后,我们要求NumPy对均方误差求平均值,即求出均方误差。
既然我们已经完成了loss()函数,那就可以得到学习程序的最后一个函数了。
被行话淹没
“均方误差”“模型”“损失”……在本书的开头部分,这些新名称不断出现。温馨提示:大部分重要术语都在附录B中有定义。如果你没有在附录中找到一个特定的术语,那么请在本书的索引中查找。