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