1.2 对象、矩阵与矢量化编程
有了工具,很多事情就变得方便了。现在,我们正式进入机器学习的基础知识。简单回忆一下绪论部分所提出的三种对象类型:文本、表格、图。乍一看,有点眼花缭乱,仔细分析下来,三种结构虽各有千秋,却存在着共性。
1.2.1 对象与维度
对于大多数程序员而言,对象应该不是个陌生的概念。在面向对象的程序设计思想中,对象就是一个类的实例。机器学习中的对象与之很相似,在机器学习中,对象是指含有一组特征的行向量。而行向量的集合最容易构造的结构就是表。下面我们来观察一张表(如表1.1),此表来源于现实中真实的统计数据:
表中第一行黑体字:种属、重量(平均)、颜色(主)、生命周期/保质期表示为特征名称。所有特征组合在一起构成一组行向量,也称为特征向量,我们为了区别线性代数中的特征值和特征向量引入对象这个名称。以非洲象、大白鲨等开头的数据行就是一组行向量,也是一个对象。对象的维度就是行向量的列数,上述数据集的维度为5。
在实际计算中,除非特殊情况,特征名称不需列明;含有字符串的对象名称因无法直接参与运算,一般情况下可以编码为数字,我们将种属特征转换为是否动物(用布尔值0,1替代),颜色特征转换为十六进制。各列的特征值为了计算方便,应统一单位,区间值可以选择中间值。为了方便量化,表1.1删除第一列,大型动物与水果表就转换为(如表1.2):
此时,该表被转换为4行、4列的数据表,维度为4。有过一些线性代数知识的朋友可以很简单的将此表转换为下面的矩阵(如表1.3):
一般而言一个对象应被视作完整的个体,代表现实中有意义的事物,不能轻易拆分。它的表现形式可能多种多样,例如在图像识别中它可能是一张图片(如图1.8):
上图是向量化的手写体图片。注意,上图的维度,即行向量的个数是32*32个,整张图被当作一行或者一个对象。因为,整张图仅代表一个完整的事物,表达了一个完整的意义。一般来说,图片数据集的维度都比较高。
文本类数据集有点特殊,需要首先生成词袋列表,再根据每个词出现的词频数值化,不过仔细想想也万变不离其宗。例如,如下文本数据集:
文本1:My dog ate my homework。
文本2:My cat ate the sandwich。
文本3:A dolphin ate the homework。
根据上述三段短文本中出现的词汇,生成词袋列表,该列表记录了上述文本中出现的每个不重复的词:
[a, ate, cat, dolphin, dog, homework, my, sandwich, the]
各段文本根据生成的词袋列表转换为对象,其维度就是词袋列表的长度,计算结果是32维。向量化后的文本称为词向量。
各段文本向量化后的词向量,其中0表示词袋中对应的词未出现在文本中,1表示该词出现在文本中1次,如果多次出现,则累加(如表1.4):
表1.4 词向量空间