在机器学习的课程中,我们可能会经常用到一些矩阵向量等线性代数知识,但是可能有一些同学之前还没有接触过线性代数的相关知识,所以这篇BLOG,就让我来给大家讲解一下一些基础的线性代数知识吧!
矩阵和向量
我们首先学习一下绍矩阵和向量的概念。
矩阵
首先让我们来看看什么是矩阵。何为矩阵?矩阵指的是由数字组成的矩形阵列,并写在方括号中间,下图就是两个矩阵:
你可以看到实际上矩阵和二维数组本质上是一样的,你可以把矩阵当初二维数组的另一个名字。另外我们还需要知道的一个概念是矩阵的维度,其一般写作矩阵的行数乘以列数。具体到刚刚那个这个例子,左边的那个矩阵包括 4 行和 2 列,因此它是一个 4 × 2的实数矩阵,写成 R(4 × 2);而右边的矩阵有 2 行和 3 列,所以我们称这个矩阵为一个 2 × 3维的矩阵,写成,写成 R(2 × 3):
接下来我们来看看表达矩阵的某个特定元素,如下图,如果 A 是一个矩阵,那么 Aij 一般表示的是矩阵的第 i 行和第 j 列对应的那个数:
因此 A11 一般表示的是矩阵中第 1 行第 1 列所对应的那个元素就等于 1402;而 A12 表示的是 第一行第二列所对应的那个数也就是191。然而 A43 这应该表示的是矩阵的第四行第三列,但这个矩阵没有第三列,因此这个值未定义的,或者你可以认为这是一个错误,根本就没有什么 A43 对应的元素。
向量
接下来让我们来谈谈什么是向量。何为向量?其实向量就是一种特殊的矩阵,一个只有一列的矩阵。所以一个 n×1 矩阵就是我们所说的向量,如下图就是一个四维的向量,四维就意味着这是一个含有 4 个元素的向量:
我们提到过可以用 R(3 * 2) 表示所有3行2列的矩阵的集合;而同样的对于所有四维向量我们可以表示为R(4):
接下来让我们来谈谈如何表示向量的元素,类似与矩阵我们将使用符号 yi 来代表 向量 y 的第 i 个元素。所以在这个矩阵中,y1表示第一个元素即460,y2表示第二个元素即232……这种认为第一个元素为开头的索引称为1-索引;有时候我们也用0-索引,此时向量元素就是从 y0 至 y3,但一般默认使用的都是1-索引法来表示向量。
最后,我们来讲讲如何表示矩阵和向量。按照惯例通常在书写矩阵和向量时,大多数人都会使用大写字母来表示矩阵,如 A B C X ……;而通常我们会使用小写字母,如a b x y……来表示数字,也就是标量;我们也可以使用小写字母a b x y……来表示向量,但为了区分我们通常都会在其头上打上一个箭头:
矩阵加减法和标量乘法
矩阵加减法
让我们先从矩阵的加减法开始,假设有下图这样两个矩阵,如果想对它们做求和运算,应该怎么做呢?
其实如果你想将两个矩阵相加,你只需要将这两个矩阵的对应位置每一个元素都逐个相加。因此,这两个矩阵相加所得到的结果,就是如下图的一个新的矩阵:
对于这个例子而言,第一个矩阵是一个3 x 2的矩阵,第二个矩阵也是一个3 x 2的矩阵,因此这两个矩阵相加的结果也是一个3行2列的矩阵。要记住我们只能将相同维度的矩阵进行相加运算,且加法所得的矩阵与相加的两个矩阵维度相同。而矩阵的减法也是类似的,只要两个矩阵中对应位置元素进行减法就可以啦,这里就不详细介绍了。
标量乘法
接下来我们来看看矩阵和标量的乘法运算,这里所说的标量一般是指一个简单的数字,或者说是实数。如果我们用数字3来和下图这个矩阵相乘,那么结果是显而易见的,你只需要将矩阵中的所有元素,都和3相乘即可以得到结果:
我们再次注意到,这是一个3行2列的矩阵,得到的结果矩阵 维度也是相同的,也是3行2列。矩阵除以标量也是类似的,只要用这个矩阵的每个元素都除于这个标量就可以了。
最后 我们来看一个稍微复杂一点的例子,我们可以把所有这些运算结合起来:
在这个运算中我们要注意运算的优先级,在矩阵中同样的,也是先进行乘除再进行加减,所以我们先做第一个运算(*)再做第四个运算(/),接着我们从左到右进行加法运算就能得到答案了:
矩阵的逆与向量乘法
要学习矩阵与矩阵相乘,我们可以从更简单的特殊情况开始入手:矩阵与向量相乘。
在开始之前,请允许我向你介绍另外两个概念——矩阵的转置和向量的内积。
矩阵的转置
何为转置呢?我们把矩阵的行列交换,得到的就是矩阵的转置,对于矩阵 A ,我们记其转置为 A(T) 如下图,下图中两个矩阵互为转置:
具体的来说,对于上面那个矩阵,我们把第一行变成第一列,第二行变成第二列就变成的第二个矩阵;也就是说我们可以把转置看成矩阵的行列互换,也可以把矩阵的转置看成矩阵关于一条斜率为-1的直线的对称(如图中蓝色虚线)。
向量的内积
接下来我们来看看什么是向量的内积,向量的内积实际上就是两个向量内部相乘之后求和的结果,所以答案就是一个具体数值;换言之就是把两个向量的对应位置的元素相乘之后相加得到的结果,所以要求两个向量所包含的元素个数是相同的,如下图:
要得到答案,只要计算出第一个向量的第一个元素 1 乘以第二个向量的第一个元素 3 的结果 3,对于答案向量第 2 个,第 3 个……第 n 个向量也一样如此,最后把所有结果相加得到的就是我们内积的答案。
矩阵与向量的乘法运算
接着让我们从一个例子开始 下图中左边是一个矩阵,右边是一个向量,假如我们将这个矩阵 A 与这个向量 x 相乘,结果会怎样呢?
其实计算过程也不复杂,为方便起见,我们设 Ai 为矩阵 A 的第 i 行的行向量,我们之前提到过,向量是 n 1 的矩阵,但是 Ai是 1 n 的,为了让他和普通矩阵相同,我们发现 Ai(T), 也就是 Ai 的转置恰好是一个 n * 1 的矩阵,也就是一个向量。
接着我先告诉你,其实矩阵和向量相乘所得的也是一个向量,而且其包含的元素个数与矩阵的行数相同。要计算出结果向量的第一个元素,只需要算出 A1(T) 与 x 的内积,即为 1 * 1 + 3 * 5 = 16
即可,而要计算出结果向量的第二个元素,只需要算出 A2(T) 与 x 的内积,即为 4 * 1 + 0 * 5 = 4
,同理,而要计算出结果向量的第i个元素,只需要算出 Ai(T) 与 x 的内积即可:
下面详细介绍了如何,计算一个矩阵与一个向量相乘。假设这是一个矩阵 A ,将它乘以一个向量 x ,若结果记为向量 y 。当矩阵 A 是一个 m × n 维矩阵, x 是一个一个 n 维向量,显然这里的两个 n 是相等的,也就是说这个矩阵的列数另一个相乘矩阵的行数相同,即必须匹配这个向量的维数。 这样相乘的结果将会是一个 m 维向量 y 。
那么如何计算这个向量y呢?事实上计算y的过程可以分为计算 yi 的值, 让 A 的第 i 行元素分别按顺序乘以向量 x 中的元素并且将结果相加这样就得到了 y 的第 i 个元素:
在机器学习中的运用
将了那么多数学的东西,让我们回归机器学习中的回归问题。假设我有四间房子大小如图,我们还有一个假设函数用于预测房子的价格:
现在我需要计算,四间房子用 hθ(x) 预测出来的房价。这里有一种简单的方法可以同时计算四间房子的预测价格,我可以将它简单地利用我们刚刚学到的矩阵向量相乘的思想来计算。
我们先构造一个 4 * 2 的矩阵,第一列全部为 1 ,第二列为四个房子的大小,我们再构造一个二维向量,里面的元素为 hθ(x) 中的系数即 40 和 0.25。将我构造好的矩阵和向量相乘得到的将会是一个四维向量,里面的四个元素对应的就是矩阵中对应行的房子对应的售价:
我们后面会谈到 Octave 的时候,你可以只写一行代码就完成整个过程 prediction = DataMatrix × Parameters
。另一种计算方式是,作为一种矩阵向量相乘的方式 实际上就是通过for循环 for 1 to 4 对吧进行运算。但是这样还是比较繁杂的,这就是我推荐 Octave 的原因之一了。
矩阵与矩阵乘法
矩阵乘法方法
这一部分让我们看看如何将两个矩阵相乘,让我们先从一个例子开始。下图中,我有两个矩阵 我想将它们相乘,那应该怎么做呢?
其实很简单,我们可以把第二个矩阵看成两个向量的组合,我们知道一个矩阵乘以向量得到的就是一个向量,那么一个矩阵乘以两个向量的组合,得到的也是两个向量的组合也就是一个矩阵啦,我们看:
所以其实矩阵乘法 A * B 的规则就是对于答案矩阵的第 i 列(也就是第 i 个列向量),其就是矩阵 A 与 B 的第 i 列(也就是第 i 个列向量)的乘积。且我们知道矩阵 A 可以乘以矩阵 B 当且仅当 A 的 列数等于 B 的行数:
在机器学习中的运用
一样地,假设我有四间房子的大小如下,而这次我同时有四个假设函数要同时计算,这样的话该怎么办呢?
其实也很简单,我们只要构造矩阵然后进行矩阵的乘法运算就可以了。第一个矩阵还是像之前一样,由于有常数项的存在第一列全部为 1 ,第二列为那四间房子对应的面积。接下来考虑构造第二个矩阵,我们知道在之前只有一个假设函数的时候,我们是直接构造元素为假设函数各项系数的向量,而这次我们有很多的假设函数,就要考虑很多个向量的组合——没错就是矩阵了。我们只要先构造出多个向量,再横向结合就得到我们想要的第二个矩阵啦:
矩阵乘法性质
交换律
对于实数而言,我们知道对于任意实数 x 和 y 我们知道有 x * y = y * x
, 这时我们称实数的乘法满足交换律。
那么对矩阵来说,是否也满足交换律呢?答案是否定的,我们来看下面这个例子:
很显然并不是对于任意的两个矩阵 A 和 B ,A B = B A。进一步来说,对于大部分矩阵 A 和 B,有 A * B ≠ B * A
。甚至当 A 为 m n 的矩阵, B 为 n p 的矩阵,当 m 不等于 p 时, B * A 是无法计算的,换言之是错误的。所以矩阵乘法并不满足交换律。
结合律
对于实数而言,我们知道对于任意实数 x 和 y 和 z 我们知道有 x * y * z = x * (y * z)
, 即先计算乘法的后两项再计算第一项和从左到右依次乘过去答案是一致的,这时我们称实数的乘法满足结合律。
那矩阵的乘法是否也满足结合律呢?答案是肯定的,对于任意的矩阵 A , B 和 C ,我们若:
两种运算顺序的结果是一致的,所以我们称矩阵的乘法满足结合律。
单位矩阵
在这一部分的最后,我们来一起学习一下一个非常特殊的矩阵——单位矩阵(I)吧!
我们从上面的例子中可以看到,其实单位矩阵就是一个 n * n 的单位矩阵,其主对角线上的元素为 1 , 其余位置的元素为 0 。
那么单位矩阵有什么特殊的呢?其实单位矩阵 I 就相当于实数中的“单位” 1 。对于实数中的单位 1 ,我们知道对于任意实数 x ,有 x * 1 = x | 1 * x = x
。同样的,对于矩阵中的单位矩阵 I,我们对于任意的矩阵 A 有 A * I = A | I * A = A
。当然对于上式中的两个 I ,其维数可能是不同的,这取决于 A 的行数和列数。
初等行变化和行化简
接下来让我们来看看矩阵的初等行变化和行化简算法。
其实矩阵的初等行变化只有三种:
1.交换任意两行;
2.将矩阵的一行同时乘以一个不为0的数;
3.将矩阵的一行替换为自己的一个非0倍数和矩阵中另一行的和;
而通过初等行变化将矩阵化简的算法称为行化简算法。若一个矩阵 A 可以通过初等行变化变成另一个矩阵 B ,那么我们称矩阵 A 和矩阵 B 行等价。
矩阵的逆
我们知道在实数领域,存在逆。换言之对于任意一个不等于 0 的实数 x,存在一个实数 y,使得x * y = y * x = 1
,这时我们称 y 为 x 的逆, 也记为 x^(-1)。
其实对于部分方阵(行数和列数相同的矩阵),也存在可逆矩阵。那么什么样的方阵才存在逆矩阵呢?其实如果一个矩阵 A 可以只用初等行变换的 2 和 3 变成一个单位矩阵,那么矩阵A就是可逆的。换言之,此时存在矩阵 B ,使得A * B = B * A = I
。
那么如何求解可逆矩阵呢?其实很简单,我们先用矩阵A 和单位矩阵构造称一个增广矩阵,下面我们举出一个例子,假设我们由矩阵 A 和单位矩阵 I 组合得到增广矩阵[A | I]:
那么接下来我们只要对[A | I]进行行化简算法,当其左半部分变成单位矩阵 I 时,右边的矩阵 B 就是 A 的逆矩阵:
这样我们就得到了可逆矩阵 A 的逆矩阵 B。
当然这只是数学上的方法,在实际操作中,我们可以使用 Octave 自带的库函数 pinv 进行快速求解:
结语
通过这篇BLOG,相信你已经对线性代数的一些基本知识有了一定了解,在接下来的机器学习BLOG中,我们也会经常用到这些知识。最后希望逆喜欢这篇BLOG!