![机器学习编程:从编码到深度学习](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=1738845807-iuTiDWR5Q773VSKW379mkWPwq1fzll8r-0-952d73c8ea514d68990a47177a65c3ae)
在之前的章节中,这个文件有两列,我们将这两列用NumPy的loadtxt()函数分别加载到两个数组之中。现在我们有多个输入变量,X必须为矩阵,如下图所示:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/048-2-i.jpg?sign=1738845807-hhMYKm6TJceKvxhTm6GTYpV1dchuMxtN-0-935d902de48124ba1b950999b3674611)
X中的每一行都是一个样本,每一列都是一个输入变量。
如果我们与之前的做法一样,使用loadtxt()函数加载文件,那么就可以得到关于每一列的NumPy数组:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-i.jpg?sign=1738845807-p070vLupcSdllKREZrU0TK3Z8tELbZ7U-0-61cb455da98d8fe0a63ec86b4b0dbbb5)
数组是NumPy最棒的特性。它们是非常灵活的对象,数据形式可以是从标量(单个数字)到多维结构的多种不同的形式。然而,这种灵活性有时会使得数组变得有些难以理解。我将会向你展示,如何将这4个数组塑造成我们想要的X和Y变量,但是当你抽出时间自己去做的时候,可能需要在手头上保留NumPy文档。
我们可以使用shape()函数查看数组的维数:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-2-i.jpg?sign=1738845807-gMRMLyAaHxY2w1DftlxpCRQWXXvPJGH4-0-3c46894cfed1ac62cb71c48d23b635ad)
所有4列都包含30个元素,每个元素对应pizza_3_vars.txt中的一个样本。逗号后的空格是NumPy表示这些数组只有一个维度的一种方式。换言之,当你看到的是“数组”这个词而不是“矩阵”的时候,你可能会想到它们。
现在将前三个数组整合起来构造一个矩阵X:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-3-i.jpg?sign=1738845807-nHdqKaDi154I6k9BI9ATEgZVRMZ8bKKi-0-37c0cdbdf2090899ba18d8af1b3c70bd)
下面是矩阵X的前两行元素:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/049-4-i.jpg?sign=1738845807-2j2JWJnEIHWYtConNqQbsKIRo0gf3dQR-0-fb8b719ba99fd7f00fe4552ebd2571cd)
虽然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=1738845807-IUox6zVZ6CL9ItSVFREEPmW4NL0HuOo7-0-dc48415f62818a4753f2fa4910b27368)
reshape()函数可以获取新数组的维度。如果新数组其中一个维度是-1,那么NumPy可以把它设置为能够适合其他维度的取值形式。因此,上面这行代码的含义是:“重塑Y,使其成为一个包含1列的矩阵,有多少行就生成多少行,以适应当前元素的取值形式”。结果产生了一个(30,1)矩阵:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/050-i.jpg?sign=1738845807-ARC9uvuPcBFdNkm0JOOK0ioEO4HFtg2z-0-d8a721856a8684d3da51bc3db7da9374)
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/050-2-i.jpg?sign=1738845807-dzmnnnDbc4MagEhn8DtmbmXQX8EsP0EG-0-5e837eaba9e32c70ae44ee9f7dbfb194)
现在我们将作为输入变量的样本数据整齐地排列在矩阵X中,将标签放在矩阵Y中。数据准备完成!现在开始升级学习系统的函数,我们从predict()函数的升级开始。