第1章 坐标与变换:高楼平地起
作为全书内容的开篇部分,本章将从空间的角度出发,详细介绍向量和矩阵的基本概念,并在空间思维的框架下描述矩阵和向量运算的基本法则,揭示其几何意义,以求迅速帮助读者搭建起关于空间的宏观知识框架,奠定学习全书内容的思想方法。
在本章知识内容的演绎、推进过程中,会逐步引出基底的选取、空间的张成、基底的转化与坐标的变换这些和空间紧密相关的概念,并使用Python语言,对相关概念和运算过程进行描述。
本章主要涉及的知识点
介绍向量的概念和基本运算
介绍基底的用途和构成条件
介绍坐标与基底之间的关系
介绍矩阵的概念和基本运算
介绍矩阵对向量空间位置的改变
介绍在矩阵的作用下,向量的基变换原理及过程
1.1描述空间的工具:向量
空间是贯穿整个线性代数的主干脉络和核心概念。那么在全书开篇的第一节,我们将重点学习如何利用向量这个重要工具对空间进行描述,从而使读者完成对“空间”从感性认识到定量描述的重要转变。
首先,我们将在向量知识基础上,开始学习行向量及列向量的基本概念,并且运用Python语言对向量进行代码表示,这也是本书的一个重要特色;然后,我们会利用Python语言熟悉和掌握如何对多个向量进行加法和乘法运算;最后,综合以上的这些知识和运算法则,引出向量线性组合的重要概念,使读者了解线性组合的构成方法和基本形式。
1.1.1 重温向量
对于向量而言,我们一定不会感到陌生。向量的概念其实很简单,直观地说,把一组数字排列成一行或一列,就称为向量。它可以作为对空间进行描述的有力工具。
例如,对于一个简单的二维向量,这个向量有两个成分:第一个成分是数字4,第二个成分是数字5。
向量可以理解为二维平面中x坐标为4、y坐标为5的一个点,也可以将其理解为以平面中的原点(0, 0)为起点,以(4, 5)为终点的一条有向线段,如图1.1所示。
图1.1 二维向量的空间表示
由此可见,一个向量中成分的个数就是该向量的维数。因此,如果进一步推广下去,还会有三维向量,如 。同理,这个三维向量可以用来表示三维空间中的一个指定点,或者用来表示在三维空间中以原点(0, 0, 0)为起点,以(3, 2, 4)为终点的一条有向线段,如图1.2所示。
图1.2 三维向量的空间表示
当然,以此类推,自然还存在更高维的向量,只不过不太好利用图形化的方式进行描述,这里就不继续展开举例了。
不过向量也不仅局限于用来直接描述空间中的点坐标和有向线段,也可以凭借基础的数据表示功能,成为一种描述事物属性的便捷工具。例如,在一次考试中,你的考试成绩为:语文85分,数学92分,外语89分。由于这3门课具有不同科目属性,因此,可以使用一个三维向量来对其进行表示,即。其实,这样看来,此时不仅仅可以把向量score看作是一个盛放数据的容器,似乎也可以利用它将科目考试成绩和空间建立起某种关联。
又如,在自然语言处理的过程中,也少不了向量这个重要的工具。程序进行文本阅读时,首先会对文本材料进行分词处理,然后使用向量对词汇进行表示。这是因为向量很适合将对象的属性和特征对应到高维空间中进行定量表达,同时在此基础上进行进一步的后续处理,如判断词汇之间的相似性等。
在本书的后续章节中,将会陆续接触到一些数据处理的基本方法:如投影、降维等,这些方法都是在向量描述的基础上实现的。
1.1.2 通常使用列向量
根据上面所讲述的向量的定义“把一组数字排列成一行或一列,就称为向量”,向量对应地就拥有两种表达方式:如果元素是纵向排列的,就将其称为列向量,如 ,;如果元素是横向排列的,就将其称为行向量,如[4 5 7]。
在实际使用向量工具进行描述和计算时,应该具体使用哪一种方式呢?在没有特殊说明的情况下,一般都默认为列向量。
从直觉上来看,似乎行向量显得更为直观,但是,这里为什么会如此偏爱列向量呢?这么做主要是为了方便后续的向量坐标变换、空间之间的映射等计算过程的处理。
在这里先不详细展开讨论,读者对此有一个直观的印象就可以了。将一个矩阵A所表示的映射作用于某个向量x上时,习惯上将其写成矩阵乘以向量的表达形式,即Ax。而这种写法的数据表示基础便是:向量x必须是一个列向量。
目前出现好几个概念,如转置、矩阵、映射等,这里先不做介绍,后面会一一详细描述。需要记住的是:一般都用列的形式来表示向量。
1.1.3 使用Python语言表示向量
了解了基本概念后,开始使用工具。对应地,应如何使用Python语言表示行向量和列向量呢?这里,需要使用Python语言中的一个常用工具库:numpy。先看如何用代码描述行向量a = [1 2 3 4]。
代码如下:
import numpy as np
a = np.array([1, 2, 3, 4])
print(a)
运行结果:
[1 2 3 4]
在Python语言中,一般使用工具库numpy来生成一个向量,但其默认生成的是行向量。但正如前面内容中所介绍的,一般情况下,通常使用列向量的形式,因此还需要对其做一些处理工作。
也许有些读者会想,用转置这个概念(后面会详细讲解)是不是就可以了,也就是把向量的行索引和列索引交换位置。但是numpy中的转置方法对于一维数组是无效的,代码如下。
import numpy as np
a = np.array([1, 2, 3, 4])
print(a.transpose())
运行结果:
[1 2 3 4]
从程序的运行结果来看,这段代码确实没有出现预期的效果。那应该如何表示一个列向量呢?具体的做法我们来演示一下。
代码如下:
import numpy as np
A = np.array([1, 2, 3, 4])
A_t = A[:, np.newaxis]
print(A_t)
print(A_t.shape)
运行结果:
[[1]
[2]
[3]
[4]]
(4, 1)
这样,就把一个行向量成功地转换成了一个列向量。这里确实用了转置的思路和做法。但是,这段代码有点复杂。
下面就来介绍一种更简单、更直观的Python语言实现方法。
1.1.4 简单生成列向量
这里需要事先用到后面涉及的知识点。显然,我们一直把向量看作是一个维数为1的数组,但是其实也可以看作是行数为1或列数为1的一个二维数组。从本书后面的内容中将会知道:二维数组对应的就是矩阵,因此向量还可以看作是一个特殊的矩阵,即可以把行向量看作是一个1×m的特殊矩阵,可以把列向量看作是一个n×1的特殊矩阵。在这个视角下,重新生成刚刚讨论的四维行向量[1 2 3 4]和对应的列向量。
代码如下:
import numpy as np
A = np.array([[1, 2, 3, 4]])
print(A)
print(A.T)
运行结果:
[[1 2 3 4]]
[[1]
[2]
[3]
[4]]
在这段代码中,需要注意的是,在对行向量进行初始化时,使用了numpy中的二维数组的初始化方法,因此在语句中多嵌套了一层中括号。在这种情况下,就可以直接通过行向量转置的方法来生成对应的列向量了。
明确了向量的表示方法后,再来梳理一下向量的基本运算。我们会逐一介绍向量的加法运算、向量的数量乘法运算、向量间的内积运算和外积运算,并且都会使用Python语言进行实现。
1.1.5 向量的加法
两个维数相同的向量才能进行加法运算,只要将相同位置上的元素相加即可,结果向量的维数保持不变。
两个n维向量u和v的加法运算规则可以表示为
向量的加法运算规则非常简单,下面举一个例子,看一看如何求解向量与向量的加法运算结果。
代码如下:
import numpy as np
u = np.array([[1,2,3]]).T
v = np.array([[5,6,7]]).T
print(u + v)
运行结果:
[[ 6]
[ 8]
[10]]
1.1.6 向量的数量乘法
向量的数量乘法就是将参与乘法运算的标量同向量的每个元素分别相乘,以此得到最终的结果向量。很显然,得到的结果向量的维数依然保持不变。向量的数量乘法从几何意义上来看,就是将向量沿着所在直线的方向拉伸相应的倍数,拉伸方向和参与运算的标量符号一致。
例如,一个标量c和一个n维向量u的乘法运算规则可以表示为
同样地,举一个例子,看一看如何求解向量与数字3的数量乘法运算结果。
代码如下:
import numpy as np
u = np.array([[1, 2, 3]]).T
print(3*u)
运行结果:
[[3]
[6]
[9]]
……
展开