机器学习与传统编程的一个重要区别在于机器学习比传统编程涉及了更多的数学知识。
不过,随着机器学习的飞速发展,各种框架应运而生,在数据分析等应用中使用机器学习时,使用现成的库和框架成为常态,似乎越来越不需要数学知识了。
其实,现成的库和框架只是帮助我们简化机器学习的开发任务,
如果想要对模型训练结果进行调整和优化,对训练数据进行变换和过滤的话,了解相关的基础数学必能让我们事倍功半。
机器学习的模型看似一堆天书般的符号和公式,其实本质并没有那么复杂,也许大部分人只是因为没有耐心去理解其中的数学符号而放弃。
我觉得对线性代数有最基本的了解就能看懂其中大部分的公式。
本文尽量用简单的方式介绍机器学习中两个最基本的结构(向量 和矩阵),以及它们的基本运算规则。
1. 向量
1.1. 定义
机器学习面对的训练数据,几乎没有只有单一属性的(也就是数据只包含一个数值或者一个字符串),
而是每个数据都包含多种属性,比如气象数据(包含温度,湿度,风向等等),金融数据(开盘价,收盘价,交易量等等),销售数据(价格,库存量,卖出数量等等)。
为了表示这个多属性的数据,或者称为多维度的数据,向量 最为合适。
向量 就是有几个数字横向或者纵向排列而成,每个数字代表一个属性。
向量 类似编程语言中的一维数组,numpy
中也是这么保存的。
1.2. 转置
向量 可以用行或者列的形式表示,
比如: <math xmlns="http://www.w3.org/1998/Math/MathML"> [ 1 , 2 , 3 ] \begin{bmatrix}1,2,3\end{bmatrix} </math>[1,2,3]或者 <math xmlns="http://www.w3.org/1998/Math/MathML"> [ 1 2 3 ] \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} </math> 123 。
向量用行 还是列 来表示,主要取决于后续进行怎样的计算,本质区别不大。
向量的转置 操作就是用来对行向量 和列向量 进行互相转换的。
1.3. 加和减
向量 之间进行加减操作时,向量的长度 必须一样,并且必须同为行向量 或同为列向量 。
简单来说,向量 之间的加减法就是对应位置的元素之间的加减法。
1.4. 积运算
向量有两种积运算,一种是向量和数值之间的积运算,也称为标量积 ;
另一种是向量和向量之间的积运算,也称为内积。
标量积 运算之后,向量还是向量,向量中的每个元素分别乘以标量。
内积 运算之后,向量变成一个数值(也就是标量):
计算规则就是向量对应位置的数值相乘,最后将每个位置的计算结果相加。
1.5. 模运算
向量还有一个模运算 ,模运算 是一种对向量量化的方式,它把向量转换为一个数值,
从而可以方便的比较不同向量的大小。
模运算的运算符号是两个竖线: <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ ∣ x ∣ ∣ ||x|| </math>∣∣x∣∣,运算规则相当于是先计算向量与自己的内积,然后开平方。
2. 矩阵
2.1. 定义
矩阵 可以看作是相同长度的行向量或者列向量的集合。
它类似编程语言中的二维数组。
矩阵 的结构如下,其中的数据按照矩形阵列 的结构排列,这也是矩阵 这个名称的由来。
这是一个3x4
的矩阵,也就是3行4列 的矩阵。
注意,矩阵的行列数量不一定要一样,当行列数量一样时,矩阵也被称为方阵。
和向量类似,矩阵也可以转置,矩阵的转置也是行列互换:
2.2. 加和减
和向量 类似,矩阵 的加减法也是对应位置的元素进行加减运算,
这就要求参与加减运算的两个矩阵 必须有相同的行数量和列数量。
矩阵减法运算类似。
行或列数量不一样的矩阵是无法进行加减运算的。
2.3. 积运算
矩阵的积运算也分为标量积 和内积 。
标量积 的计算与向量类似,矩阵的每个元素都乘以标量。
内积 运算略微复杂一些,对参与运算的矩阵也有要求,需要第一个矩阵的列数量 等于第二个矩阵的行数量 。
即:矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A和 <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B能够进行内积运算的话, <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A和 <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B分别为 <math xmlns="http://www.w3.org/1998/Math/MathML"> M × N M\times N </math>M×N和 <math xmlns="http://www.w3.org/1998/Math/MathML"> N × K N\times K </math>N×K的矩阵,
它们的内积是一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> M × K M\times K </math>M×K矩阵。比如:
2.4. 单位矩阵和逆矩阵
矩阵中有一种极其重要的特殊矩阵,被称为单位矩阵 。
单位矩阵首先是一个方阵,并且除了对角线上的元素为1
之外,其他元素都是0
。比如:
单位矩阵虽然简单,作用却不小,在矩阵分解和做高斯消元等运算时有重要的作用。
如果对于矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A,存在一个矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B,使得 <math xmlns="http://www.w3.org/1998/Math/MathML"> A B = I AB=I </math>AB=I,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> I I </math>I是单位矩阵。
那么, <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A的逆矩阵 ,同时 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A也是 <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B的逆矩阵 , <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B一般表示为 <math xmlns="http://www.w3.org/1998/Math/MathML"> A − 1 A^{-1} </math>A−1。
也就是: <math xmlns="http://www.w3.org/1998/Math/MathML"> A A − 1 = A − 1 A = I AA^{-1}=A^{-1}A=I </math>AA−1=A−1A=I
3. 总结
向量 和矩阵是机器学习中使用最多的两种结构,比如:
- 线性回归模型: <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n = w T x f(x) = w_0+w_1x_1+w_2x_2+...+w_nx_n=w^Tx </math>f(x)=w0+w1x1+w2x2+...+wnxn=wTx
- 聚类函数欧氏距离: <math xmlns="http://www.w3.org/1998/Math/MathML"> d ( X i , C j ) = ∣ ∣ X i − C j ∣ ∣ 2 d(X_i, C_j) = ||X_i - C_j||^2 </math>d(Xi,Cj)=∣∣Xi−Cj∣∣2
- 数据正则化时的L2范数: <math xmlns="http://www.w3.org/1998/Math/MathML"> ∥ x ∥ 2 = ∑ i = 1 m ∣ x i 2 ∣ \parallel x \parallel_2=\sqrt{\sum_{i=1}^m \mid x_{i}^2\mid} </math>∥x∥2=∑i=1m∣xi2∣
- 等等... ...
仔细观察机器学习模型中涉及的各种公式,大部分都是一些向量 和矩阵 的运算,包括加减,标量积和内积等等。
之所以觉得困难,是因为我平时生活中用的计算几乎都是标量运算,对于向量 和矩阵 的运算不熟悉,
再加上对各种数学符号不熟悉,混在一起的时候就觉得像天书一样。
其实,向量 可以当成是一种特殊的矩阵 ,我们可以把行向量看成是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 × N 1\times N </math>1×N的矩阵;
把列向量看成是 <math xmlns="http://www.w3.org/1998/Math/MathML"> N × 1 N\times 1 </math>N×1的矩阵。
最后,给大家留下一个小小的问题,
请问:向量和矩阵的运算有加减法和乘法的运算,却没有除法相关运算,为什么?