空间是贯穿整个线性代数学习内容的主干脉络和核心概念。那么在全书开篇的第一节,我们将重点学习如何利用向量这个重要工具对空间进行描述,从而使读者完成对“空间”从感性认识到量化描述的重要转变。
首先,我们将在大家已经熟悉的向量知识基础上,开始学习行向量以及列向量的基本概念,并且运用Python工具对向量进行代码表示,这也是本书的一个重要特色。紧接着,我们会利用Python工具熟悉和掌握如何对多个向量进行加法和乘法运算。最后,综合以上的这些知识和运算法则,我们引出向量线性组合的重要概念,使读者了解线性组合的构成方法和基本形式。
向量对于大家而言一定不会陌生,向量的概念其实很简单,直观的说:把一组数字排列成一行或者一列,就称作是一个向量。他可以作为对空间进行描述的有力工具。
比如:对于一个简单的二维向量:
。这个向量有两个成分:第一个成分是数字4,第二个成分是数字5。
一方面,我们可以把向量
理解成二维平面中`坐标为4,坐标为5的一个点,也可以将其理解为以平面中的原点
为起点,到终点
的一条有向线段,如图1.1所示:

图1.1 二维向量的空间表示
由此可见,一个向量中成分的个数就是该向量的维数。因此,如果我们进一步推广下去,还会有三维向量,如:
。同理,这个三维向量可以用来表示三维空间中的一个指定点,或者用来表示在三维空间中以原点
为起点到目标终点
的一条有向线段,如图1.2所示:

图1.2 三维向量的空间表示
当然,以此类推,自然还存在更高维的向量,只不过这里不太好利用图形化的方式进行描述,我们就不继续展开举例了。
不过向量也不仅仅局限于用来直接描述空间中的点坐标和有向线段,他也可以作为描述事物属性的一种便捷工具和基础的数据表示形式。比如在一次考试中,你的考试成绩为:语文85分,数学92分,外语89分。由于这三门课分属于你的不同科目属性,因此,我们可以使用一个三维向量来对其进行表示,即:
。其实,这样看来,我们此时也可以不仅仅只把向量score看作是一个盛放数据的容器,似乎也可以利用他将科目考试成绩和空间建立起某种关联。
又比如,在自然语言处理的过程中也少不了向量这个重要的工具。程序进行文本阅读时,首先会对文本材料进行分词处理,然后使用向量对词汇进行表示。这是因为:向量很适合将对象的属性和特征对应到高维空间中进行量化表达,同时在此基础上进行进一步的后续处理,如判断词汇之间的相似性等等。
在本书的后续章节中,我们将陆续接触到一些数据处理的基本方法:如投影、降维等等,这些方法都是在向量描述的基础上实现的。
根据刚才我们所讲述的向量的定义,把一组数字排列成一行或者一列就称之为向量。因此,向量对应的就拥有两种表达方式:像
,
这种元素纵向排列的,我们称之为列向量。那么同理可知,如果元素是横向排列的,我们自然是将其称之为行向量,比如:
。
我们在实际使用向量工具进行描述和计算的时候,应该具体使用哪一种方式呢?在没有特殊说明的情况下,一般我们提到向量,都默认为是列向量。
我们从直觉上来看,会感觉到似乎行向量显得更为直观呀?但是,这里为什么会如此偏爱列向量呢?这么做主要是为了方便后续的向量坐标变换、空间之间的映射等计算过程的处理。
我们在这里还不急着详细展开讨论,只是简单的提一句,大家有一个直观的印象就好了:当我们将一个矩阵A所表示的映射作用于某个向量x上时,我们习惯于将其写成矩阵乘以向量的表达形式,即:Ax。而这种写法的数据表示基础便是:向量x必须是一个列向量。
这里一下子堆上来好几个概念,比如转置、矩阵、映射等等,我们在这里都先不急着一下子展开,后面会一一详细描述。大家在这里就请先记住:一般我们都用列的形式来表示向量。
了解了基本概念之后,现在我们就把工具用起来。对应的,我们如何用Python语言来表示行向量和列向量呢?这里,我们需要使用Python数据分析中的一个常用工具库:numpy。先看如何用代码描述行向量
。
代码如下:

运行结果:

在Python语言中,一般使用numpy库来生成一个向量。用numpy默认生成的是行向量,但正如我们前面内容中所介绍的,一般情况下我们通常使用的是列向量的形式,因此还需要对其做一些处理工作。
你的第一感觉可能会想,用一用转置这个概念(后面会详细讲解)是不是就可以了,也就是把向量的行索引和列索引交换位置,但是numpy中的转置方法对于一维数组是无效的,读者可以看看下面这段代码:

运行结果:

很遗憾,我们发现:从程序的运行结果来看,这段代码确实没有起到我们预期的效果。那我们应该如何来表示一个列向量
呢?具体的做法我们来演示一下。
代码如下:

运行结果:

这样,我们就把一个行向量成功的转换成了一个列向量。这里确实是用了转置的思路和做法。但是,大家有没有感觉到,这段代码看上去怪怪的,有点略复杂,不太是我们想要的形式。
那存不存在一种更简单、更直观的Python实现方法呢?答案是:有。请读者继续慢慢往下看。
这里我们事先用一点后面会涉及到的知识点:显然,我们一直把向量看作是一个维数为1的数组,但是其实也可以看作是行数为1或者列数为1的一个二维数组。从本书后面的内容中我们将会知道:二维数组对应的就是矩阵,因此向量还可以看作是一个特殊的矩阵。
即:我们可以把行向量看作是大小为1×m的特殊矩阵,同时可以把列向量看作是n×1的特殊矩阵,我们在这个视角下,去重新生成刚刚讨论的4维行向量和对
应列向量
。
代码如下:

运行结果:


在这段代码里,我们有一个地方需要注意:在对行向量进行初始化的时候,我们使用了numpy库中的二维数组的初始化方法,因此在语句里多嵌套了一层中括号。在这种情况下,我们就可以直接通过行向量转置的方法来生成对应的列向量了,感觉是不是简单了许多!
明确了向量的表示方法之后,那么接下来,我们就来梳理一下向量的基本运算,我们会逐一介绍向量的加法运算、数量积运算、向量间的内积运算和外积运算,并且都会使用Python代码进行实现。
两个维数相同的向量才能进行加法运算,只要将相同位置上的元素相加即可,结果向量的维数保持不变。
两个n维向量u和v的加法运算规则可以表示为:

看上去,向量的加法运算规则非常简单,我们来举个实际的例子看一看,求解向量
与向量
的加法运算结果。
代码如下:

运行结果:

向量的数量乘法就是将参与乘法运算的标量同向量的每个元素分别相乘,以此得到最终的结果向量。很显然,得到的结果向量依然保持维数不变。向量的数量乘法从几何意义上来看就是将向量沿着所在直线的方向拉伸到相应的倍数,拉伸方向和参与运算的标量符号一致。
例如,一个标量c和一个n维向量u的乘法运算规则可以表示如下:

同样,我们也举一个例子,来计算向量
与数字3的标量乘法计算结果。
代码如下:

运行结果:

向量间的乘法分为内积和外积两种形式,首先我们来介绍向量的内积运算。参与内积运算的两个向量要求维数相等,运算规则是将对应位置上的元素先相乘,然后合并相加,向量内积最终的运算结果是一个标量。
例如,两个n维向量u和v进行内积运算的规则如下:

这个定义看上去很简单,好像没有什么特殊含义。但是,内积的另一种表示方法
所包含的物理意义就十分清晰,他表示向量u在向量v方向上的投影长度乘上向量v的模长。
换句话说,如果v是单位向量,内积就可以直接描述为向量u在向量v方向上的投影长度。如图1.3所示。

图1.3 向量内积的几何表示
需要注意的是,我们在实际计算向量内积的时候,无论是行向量间的内积还是列向量间的内积,其最终运算结果都是一样的。
使用Python工具计算向量的内积非常方便。但是需要注意到的一点是,如果我们直接使用numpy函数库中的内积方法dot进行运算操作,那么内积运算函数dot中传入的参数则要求必须是用一维数组表示的行向量。
我们来实际计算一下向量
与向量
的内积运算结果。
代码如下:

运行结果:

那么自然有人就会问了,在上文中我们学习了表示行、列向量的通用方法(即用行或列为1的二维数组来表示向量),用在这里进行内积运算行不行?如果这么做程序是会报错的,我们可以试试看。
代码如下:

运行结果:

同样的,用二维数组表示的列向量进行内积运算,程序同样也会报错。
代码如下:

运行结果:

看上去似乎让人有些迷惑,既然可以使用二维数组来表示向量,那么为什么用他们进行内积运算结果会不对呢?
大家学完整个第一章之后就会知道:这种向量的表示方法本质上其实是矩阵,只不过是行数或者列数为1的特殊矩阵罢了,将这种方法表示下的向量作为内积运算函数的参数,就需要依据矩阵的乘法法则来计算。此时,若是依据矩阵乘法的运算法则来判定就会报错,至于说为什么不对,后面的小节会重点讲述。
如果一定要使用这种向量的表示方法,怎么样才能得到正确的结果呢,这里先提前预告一下。
代码如下:

运行结果:

我们得到了一个正确的数值结果,至于说前者为什么会出错,而这里为什么又能得到正确的结果,学完本章之后,大家就都明白了。
下面,我们接着介绍向量间的外积运算。在这里我们只讨论在二维平面和三维空间中的运算情况:
在二维平面中,向量u和向量v的外积运算法则如下:

和内积运算相类似,对于外积运算,我们同样也有另外一种表达式:
,这种表达式看起来物理意义也会更加直观一些。
如图1.4所示,二维平面中向量的外积表示两个向量张成的平行四边形的面积。当然了,这里的面积要打上引号,因为如果两个向量的夹角大于180°,则最终向量外积运算所得到的结果为负。
图1.4 向量外积的几何表示
我们来计算一下向量
和向量
的外积运算结果。
代码如下:

运行结果:

而在三维空间中,外积的计算则要相对更加复杂一些,其计算所得到的结果是一个向量而不是一个数值。
三维向量u和v的外积运算法则如下:

通过外积运算,最终得到的结果向量也是有明确的物理含义的,即表示u和v两个向量张成平面的法向量。
我们来看看向量
与向量
的外积运算结果。
代码如下:

运行结果:

基于向量加法和数量乘法这两类基本运算,我们将其进行组合应用,就是接下来要介绍的向量的线性组合。
我们首先来介绍一下向量线性组合的具体含义。针对向量u和向量v,我们先求出标量c和向量u的数量积,再求出标量d和向量v的数量积,最后我们再将二者进行叠加,就得到了向量u和向量v的线性组合cu+dv。需要注意的是,这里的标量c和标量d可以取到任意值(自然也包括 0)。
针对线性组合,我们再来举一个实际例子,来看一看下面3个3维向量:
,
,
的线性组合运算规则。
。其中,c , d , e 可以取包含0在内的任意值。
当然,维数向上扩展到任意维数n也是同理。
在这里,我们基于上面的运算法则,利用Python工具来对3个已知向量
,
,
进行线性组合运算:
。
代码如下:

运行结果

那么进一步我们再思考一下,下面几种情况的线性组合所表示的图像是什么样的?我们知道,两个向量相加在几何上就是将两个向量首尾依次连接,所得到的结果向量就是最初的起点和最终的终点的有向连线。我们假定有三个非零的三维向量:
,
,
,我们讨论他们线性组合的几种不同情况。
第一种情况:cu的所有线性组合的图像。
由于标量c可以取0值,因此cu的所有线性组合可以表示为三维空间中一条穿过原点
的直线(当然包括原点本身),如图1.5所示:

图1.5 cu所有线性组合构成的图像
第二种情况:cu+dv的所有线性组合图像。
(1)当向量u和向量v不在一条直线上时, cu+dv的所有线性组合可以表示为三维空间中的一个通过原点
的二维平面,如图1.6所示。

图1.6 向量u和v不共线时,所有线性组合cu+dv所构成的图像
(2)当向量u和向量v处在一条直线上时,cu+dv的所有线性组合构成的图像退化成情况一,这里就不单独绘图说明。
第三种情况:cu+dv+ew的所有线性组合的图像。
(1)当向量u,v,w不在一个平面上时,cu+dv+ew的所有线性组合构成的图像是整个三维空间;
(2)当向量u,v,w处在一个平面上时,cu+dv+ew的所有线性组合构成的图像退化成情况二;
(3)当向量u,v,w处在一条直线上时,cu+dv+ew的所有线性组合构成的图像退化成情况一。
这三些不同的情形在前面都有对应的图文描述,这里就不再一一绘图说明了,请读者们自己对照思考一下。
其实大家不难发现,我们在讨论上述线性组合的多种不同情况时,均反复提到了共线、共面的概念。这些特殊性质会对一组向量线性组合所得到的结果向量在空间中的位置分布产生重要影响,他们构成了线性代数中非常关键的概念。
在后续章节中,我们会围绕它继续展开更为深入的讨论,不过我们会使用更加专业的词汇来对其进行描述和介绍,即:线性相关和线性无关。