![机器学习编程:从编码到深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/201/38335201/b_38335201.jpg)
4.3.1 数据准备
真希望我可以告诉你,机器学习是在构建一种令人惊叹的人工智能并且看起来很酷。但事实上,机器学习的很大一部分工作是在为学习算法准备样本数据。让我们从包含样本数据集的文件开始:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/048-i.jpg?sign=1739303580-IhcCYUMe5ZqsJ3T9pPIsIddoHqm77JHm-0-020d4f9f1c6ba26040c0f2f55e6b3e37)
在之前的章节中,这个文件有两列,我们将这两列用NumPy的loadtxt()函数分别加载到两个数组之中。现在我们有多个输入变量,X必须为矩阵,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/048-2-i.jpg?sign=1739303580-Snja7AGOAsuqqHWhlOxomd9QlXW1p9n8-0-2516d5234c03d8ed68731f8fb07843dd)
X中的每一行都是一个样本,每一列都是一个输入变量。
如果我们与之前的做法一样,使用loadtxt()函数加载文件,那么就可以得到关于每一列的NumPy数组:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-i.jpg?sign=1739303580-Fc9l4s42k8rysWwVVHwWEATBkpP0TrEl-0-95a37308c41f131a8c5272812323370e)
数组是NumPy最棒的特性。它们是非常灵活的对象,数据形式可以是从标量(单个数字)到多维结构的多种不同的形式。然而,这种灵活性有时会使得数组变得有些难以理解。我将会向你展示,如何将这4个数组塑造成我们想要的X和Y变量,但是当你抽出时间自己去做的时候,可能需要在手头上保留NumPy文档。
我们可以使用shape()函数查看数组的维数:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-2-i.jpg?sign=1739303580-RFsn9ezM1u11cBu9c50GprGRSE693plD-0-f52530bce939fc881ddc3e29a7c6d985)
所有4列都包含30个元素,每个元素对应pizza_3_vars.txt中的一个样本。逗号后的空格是NumPy表示这些数组只有一个维度的一种方式。换言之,当你看到的是“数组”这个词而不是“矩阵”的时候,你可能会想到它们。
现在将前三个数组整合起来构造一个矩阵X:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-3-i.jpg?sign=1739303580-tYFzAXFsTsCAvXbg6hf7gdl7tjP6F47o-0-f3a0d0508734749175d5a5a0d7c8a1f4)
下面是矩阵X的前两行元素:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-4-i.jpg?sign=1739303580-TRSWrQnmtAoxdmdTb3NnAmUUxRSHPMJw-0-56def38046978c24be463c9b97e1d8af)
虽然NumPy中的索引功能十分强大,但它有时令人费解。代码中的[:2]是[0:2]的简写,意思是:“包含索引号为0~1的行”,也就是前两行(按原书翻译,索引号0~2的行,应该是前3行,表述有误,已改——译者注)。
现在已经处理好了X,再来处理y。它仍然是一维数组的形式(30,)。这里有一个多次帮了我大忙的技巧——避免混合使用NumPy矩阵和一维数组。同时涉及一维数组和矩阵的代码可能会产生令人意想不到的行为。因此,当你有一个一维数组的时候,可以使用reshape()函数将其重塑为一个矩阵:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-5-i.jpg?sign=1739303580-TevYaHinJZq35boHLaLQA80xFCVExHTS-0-38e12599d67867f47c2385e5db24dbbf)
reshape()函数可以获取新数组的维度。如果新数组其中一个维度是-1,那么NumPy可以把它设置为能够适合其他维度的取值形式。因此,上面这行代码的含义是:“重塑Y,使其成为一个包含1列的矩阵,有多少行就生成多少行,以适应当前元素的取值形式”。结果产生了一个(30,1)矩阵:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/050-i.jpg?sign=1739303580-IRT1urkyvW4L21rGgEKeykPLKLo7PNyp-0-fbe720b796e86c85e93b9afeb34797c7)
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/050-2-i.jpg?sign=1739303580-7GbItFzjDiDdnhCVMvIIqd0qi1JDbiIh-0-5000e64fe150c29e2612981c6935feae)
现在我们将作为输入变量的样本数据整齐地排列在矩阵X中,将标签放在矩阵Y中。数据准备完成!现在开始升级学习系统的函数,我们从predict()函数的升级开始。