Series · Linear Algebra · Chapter 1

向量的本质 -- 不仅仅是箭头

向量无处不在 -- 从 GPS 导航到 Netflix 推荐。本章从空间中的箭头出发,构建直觉,一路推进到抽象向量空间,涵盖加法、数乘、内积、范数,以及线性性为何如此重要。

为什么要学向量?

物理学家说"力",数据科学家说"特征",游戏程序员说"速度",量子物理学家说"态"——表面看是四个不同的世界、四种不同的语言,背后其实是同一个数学对象:向量

这并非巧合。向量是数学里最小、最灵活的一块拼图,它能描述任何"可以加起来、可以乘以一个数"的东西。一旦你抓住了这个模式,就会在四面八方都看到它。

入门课通常给你两种向量的"定义":

  • 一个有方向、有长度的"箭头"。
  • 一列有序的数字。

两种说法都对,也都只说对了一半。完整的故事是:向量就是任何活在"向量空间"里的对象——一个对加法和数乘都听话的集合。箭头和数列只是其中最有名的两个例子;函数、信号、多项式、量子态同样合格。

本章会顺着这架梯子一阶一阶往上爬,从最直观的图形一直到真正抽象的公理:

  1. 几何视角:可以画出来的箭头。
  2. 数值视角:可以拿来算的数字列。
  3. 结构视角:内积——把几何与代数粘合起来。
  4. 公理视角:让上面这一切对任何合格对象都成立的规则。

你将学到

  • 用几何(箭头)和数值(列表)两种方式思考向量
  • 三种基本运算:加法、数乘、减法
  • 点积——代数与几何对"对齐程度"达成共识
  • 几种衡量大小的方式(范数)以及为何不止一种
  • 向量空间的公理化定义——为何函数也是向量

前置知识

  • 中学代数
  • 直角坐标系
  • 勾股定理

一、几何视角:把向量当作箭头

1.1 从"走几步"到一个向量

你站在公园中央(把它当作原点)。朋友说:“向东走 4 步,再向北走 3 步。”

这条指令就是一个向量。我们写成

$$\vec{v} = \begin{pmatrix} 4 \\ 3 \end{pmatrix},$$

其中$4$是东向($x$分量),$3$是北向($y$分量)。

两个事实立刻浮现。第一,长度——你最终离起点多远——就是勾股定理:

$$\|\vec{v}\| = \sqrt{4^2 + 3^2} = 5.$$

第二,方向就是从正东逆时针旋转的角度:

$$\theta = \arctan\!\left(\frac{3}{4}\right) \approx 37^\circ.$$

所以一个向量把长度方向这两件几何信息打包在一起。

一个二维向量:长度、角度与分量

1.2 平移不变性:向量没有"老家"

第一个常常让初学者意外的事实是:向量并不在乎它从哪里出发。无论"4 东、3 北"是从公园中心起步,还是从公园东北角起步,都是同一个向量。只有方向和长度才是它的"身份"。

最干净的例子是速度。一艘正以 20 节速度向东航行的船,无论它在太平洋中央还是紧贴着西班牙海岸,速度向量都一样。位置每分钟都在变,速度向量却没变。

正因如此,我们画向量时通常把它锚定在原点——这是一种方便,而不是一种约束。

位置向量 vs 自由向量:同一个箭头,三个不同位置

1.3 向量加法:一个动作,三种画法

给定两个向量$\vec{a}$和$\vec{b}$,它们的和$\vec{a} + \vec{b}$有三种等价的画法。

首尾相接。 先沿$\vec{a}$走,再沿$\vec{b}$走,从最初的起点到最终的落点画一条箭头,就是和。这是我们直觉上理解"先后两段位移"的方式。

平行四边形。 把两个向量都从同一点画出,补全平行四边形,从这个公共点出发的对角线就是和。物理学家叠加两个作用力时用的就是这种画法。

逐分量相加。 直接把对应坐标加起来:

$$\begin{pmatrix} 3 \\ 1 \end{pmatrix} + \begin{pmatrix} 1 \\ 2.5 \end{pmatrix} = \begin{pmatrix} 4 \\ 3.5 \end{pmatrix}.$$

几何画法是用来理解的,分量公式是用来计算的。它们是同一枚硬币的两面。

向量加法:首尾相接与平行四边形给出同一个和

1.4 数乘:拉伸、压缩、反向

把向量$\vec{v}$乘以一个数$c$(标量),就是沿它自己所在的那条直线把它重新缩放。结果分成四种情况:

-$c > 1$:在原方向上拉长。 -$0 < c < 1$:在原方向上缩短。 -$c = 0$:缩成零向量。 -$c < 0$:反向,并按$|c|$缩放。

非零向量的所有数乘构成一条经过原点的直线——这就是后面第 2 章会正式讲的**张成(span)**的雏形。

数乘以及"所有数乘"构成的那条直线(即张成)

1
2
3
4
5
6
import numpy as np

v = np.array([3, 4])
print( 2.0 * v)   # [ 6.   8. ]   拉长
print( 0.5 * v)   # [ 1.5  2. ]   缩短
print(-1.0 * v)   # [-3.  -4. ]   反向

开车的类比能让这个画面留下深刻印象。如果$\vec{v}$是当前速度,那么$2\vec{v}$是加速到一倍快,$0.5\vec{v}$是减速到一半,$-\vec{v}$则是同样的车速来一个掉头。

1.5 向量减法:从这里到那里

如果$\vec{a}$和$\vec{b}$是两个点$A$、$B$的位置向量(即从原点出发的箭头),那么

$$\vec{b} - \vec{a} \;=\; \text{从 } A \text{ 指向 } B \text{ 的位移向量}.$$

游戏引擎几乎每一帧都在做这件事:玩家到目标的方向、子弹应飞向的方向、两个航点之间的偏移——都是位置向量的差。


二、数值视角:把向量当作数据

2.1 越过二维和三维

画箭头在二维、三维都还轻松。但向量真正的威力是它的代数任意维度都同样成立:

$$\vec{v} = \begin{pmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{pmatrix} \in \mathbb{R}^n.$$

你画不出 100 维的箭头,但所有运算——加法、数乘、内积、范数——都原封不动地成立。这就是从"看得见的几何"通往"算得出来的几何"的那座桥。

2.2 同一个向量,三种身份

下面这五个数$\{25.3,\,65.0,\,1013,\,15.2,\,45\}$,我们用三种不同传统的眼光来看,看到的其实是同一个向量。

同一个向量的三种身份:箭头、特征向量、列向量

物理学的眼光。 物理空间里的一支箭头,比如一个速度或一个力。

计算机的眼光。 一个特征向量:刻画一条样本的若干测量值——这里就是某一时刻的天气状态(温度、湿度、气压、风速、云量)。

数学的眼光。 一列实数,$\mathbb{R}^5$里的一个元素。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np

# 一张 28x28 的灰度图,可以摊平成一个 784 维向量
image = np.array([
    [  0, 128, 255],
    [ 64, 192,  32],
    [100,  50, 200],
])
image_vector = image.flatten()
print(image_vector.shape)   # (9,)

一旦接受这"三种身份其实是同一个对象",许多看起来风马牛不相及的事情就会变成同一个计算。比较两个用户的电影口味、比较两张图片的相似度、比较两个分子的指纹——本质上都是马上要定义的同一个点积。

1
2
3
4
5
6
7
8
import numpy as np

alice = np.array([5, 3, 0, 1, 4])
bob   = np.array([4, 0, 5, 2, 4])
carol = np.array([5, 4, 1, 1, 5])

print(f"alice . bob   = {np.dot(alice, bob)}")     # 28
print(f"alice . carol = {np.dot(alice, carol)}")   # 57  -- 更相似!

NLP 里有个著名的例子把这件事推得更远:把单词训练成 300 维向量后,可以惊人地得到$\text{king} - \text{man} + \text{woman} \approx \text{queen}$。向量算术能捕捉语义。


三、内积:几何与代数在这里握手

内积(在$\mathbb{R}^n$里也叫"点积")是本章最深的一个运算。它藏着一个小奇迹:两个看上去毫不相关的定义,居然给出同一个数。

3.1 一个运算,两种定义

代数定义:

$$\vec{a} \cdot \vec{b} \;=\; \sum_{i=1}^{n} a_i b_i \;=\; a_1 b_1 + a_2 b_2 + \cdots + a_n b_n.$$

几何定义(在$\mathbb{R}^2$或$\mathbb{R}^3$里):

$$\vec{a} \cdot \vec{b} \;=\; \|\vec{a}\|\,\|\vec{b}\|\,\cos\theta,$$

其中$\theta$是$\vec{a}$与$\vec{b}$之间的夹角。

代数式告诉你怎么算;几何式告诉你这个数到底意味着什么:内积衡量了两个向量"方向上有多一致"。同向,得到一个大的正数;垂直,恰好是零;反向,得到一个绝对值很大的负数。

3.2 投影:最佳近似

一张图就能让点积从公式变回几何。从$\vec{a}$的箭头尾端向$\vec{b}$所在的直线作垂线,落下的"影子"就是$\vec{a}$在$\vec{b}$上的投影

$$\operatorname{proj}_{\vec{b}}\vec{a} \;=\; \frac{\vec{a}\cdot\vec{b}}{\vec{b}\cdot\vec{b}}\,\vec{b}.$$

它是*$\vec{b}$所在直线上离$\vec{a}$最近的那个点*。这绝非偶然——后面要见的最小二乘回归、主成分分析、信号滤波……一系列"最佳一维线性近似"问题,都是同一个想法的延伸。

点积即投影:锐角时为正、钝角时为负

1
2
3
4
5
6
import numpy as np

a = np.array([3, 4])
b = np.array([1, 0])
proj = (np.dot(a, b) / np.dot(b, b)) * b
print(proj)   # [3. 0.]

3.3 正交:把"独立"几何化

当$\vec{a} \cdot \vec{b} = 0$时,我们说两个向量正交(即垂直),记作$\vec{a} \perp \vec{b}$。在几何上就是 90°夹角。为什么这件事值得一个专门的名字

  • 几何上: 正交方向"互不干扰"——沿其中一个方向移动,丝毫不会改变在另一个方向上的投影。
  • 统计上: 两个不相关的随机变量正好对应两个正交向量(协方差$= 0$)。
  • 计算上: 一组正交基把一个高维问题拆成若干个独立的一维问题。数值线性代数里几乎所有"算得快"的技巧,都建立在正交性之上。

3.4 Cauchy–Schwarz 不等式

对任意两个向量,都有

$$|\vec{a}\cdot\vec{b}| \;\leq\; \|\vec{a}\|\,\|\vec{b}\|,$$

等号当且仅当其中一个是另一个的标量倍时成立。用一句话说:点积永远不会超过两条向量长度的乘积。它本质上是$|\cos\theta| \leq 1$的代数化身,也是整个分析学里被引用最多的一个不等式。


四、范数:测量"大小"的多种方式

我们熟悉的"长度"$\sqrt{x_1^2+\cdots+x_n^2}$只是衡量向量大小的一种合法方式,叫做**$L^2$范数**。它不是唯一的——而你选哪一种范数,会改变整个问题的几何形状。

4.1 三种最常用的范数

范数公式直觉
$L^2$(欧几里得)$\sqrt{\sum_i x_i^2}$直线距离
$L^1$(曼哈顿)$\sum_i \lvert x_i \rvert$城市街区距离,只能沿街道走
$L^\infty$(最大)$\max_i \lvert x_i \rvert$最坏情况的那个分量

为什么要三种?因为不同问题在乎的事情不一样:

-$L^2$光滑、可微(除原点外)、旋转不变,是默认的安全选项,也是点积天然的搭档。 -$L^1$有"棱角"。这种不光滑性其实是优点:它会推着优化器把许多坐标精确地压成零。这就是 LASSO 回归与压缩感知背后的秘密。 -$L^\infty$用于你只在乎最差分量、而不在乎平均的场景——鲁棒控制、误差上界、最坏情形的保证。

4.2 单位球:每种范数的"几何指纹"

看清一个范数最干净的方法,就是画出它的单位球——所有"长度为 1"的向量构成的集合。三种范数,三种风格迥异的形状:

L1、L2、L∞ 三种范数的单位球:菱形、圆、方

菱形在坐标轴上的尖角,正是$L^1$能产生稀疏解的原因:当你在这个菱形约束下做优化,最优点更可能落在尖角上,而尖角意味着若干坐标恰好是零。

一个让人安心的定理——范数等价性——告诉我们:在有限维空间里,所有范数在"定性"上是一致的,一个数列在某种范数下收敛当且仅当它在所有范数下都收敛。具体数值会变,拓扑结构不变。


五、抽象视角:从公理出发的向量空间

到目前为止,“向量"对我们来说一直是"箭头"或"一列数字”。但数学家很早就注意到一件让人震惊的事:很多看起来毫无关系的对象——箭头、多项式、连续函数、随机变量、量子态——遵守同一套规则。于是他们干脆把这些规则提炼成定义。

5.1 定义

一个向量空间$V$(在域$\mathbb{F}$上,通常$\mathbb{F}=\mathbb{R}$或$\mathbb{C}$)是一个集合,它配备两种运算:

  • 向量加法$\vec{u} + \vec{v} \in V$,
  • 数乘$c\,\vec{v} \in V$,

并满足十条公理(加法的交换律与结合律,零向量与逆元的存在性,分配律,数乘的结合律,单位元)。公理是细节;精神是一句话:

任何"能加、能乘以一个数、并且服从一般的代数规则"的对象,就是向量。

5.2 让人意外的向量空间

连续函数。 区间$[0,1]$上的所有连续函数构成一个向量空间:逐点加$(f+g)(x) = f(x)+g(x)$,逐点乘$(cf)(x)=cf(x)$,零向量是恒等于 0 的常函数。这是一个无穷维的空间——你可以把一个函数想成"在每个$x \in [0,1]$处都各有一个分量"的向量。

多项式。 次数不超过$n$的多项式构成一个$(n+1)$维向量空间,自然基是$\{1,x,x^2,\ldots,x^n\}$。

矩阵。$m\times n$矩阵构成一个$mn$维的向量空间,加法和数乘都是逐元素的。

量子态。 一个量子态就是某个复 Hilbert 空间里的单位向量。著名的"叠加态"无非是穿了燕尾服的向量加法。

5.3 抽象为什么值得?

一旦你在公理层面证明了一个定理,它就能用在任何满足公理的地方:

  • Cauchy–Schwarz 既适用于列向量、函数空间,也适用于随机变量(这时它就是协方差不等式$|\operatorname{Cov}(X,Y)| \le \sigma_X \sigma_Y$)。一个定理,三个学科。
  • 傅里叶分析就是"把函数分解成正交基向量的线性组合"——和我们在第 7 章对列向量做的事完全相同。
  • 量子力学是"在无穷维内积空间里做物理"。

这就是线性代数最深的回报:把结构学一次,受益终身


六、生活中的向量

6.1 五行代码写一个游戏物理

1
2
3
4
5
6
7
8
9
import numpy as np

position     = np.array([100.0, 200.0])
velocity     = np.array([  5.0,  -2.0])
acceleration = np.array([  0.0,  -9.8])   # 重力
dt = 1 / 60                                # 60 帧每秒

velocity = velocity + acceleration * dt
position = position + velocity * dt

这就是离散化的牛顿力学。每一款游戏物理引擎,骨子里都是这两行代码、每秒重复 60 次。

6.2 调色就是向量加法

1
2
3
4
5
6
7
import numpy as np

red   = np.array([255,   0,   0])
blue  = np.array([  0,   0, 255])

purple   = (red + blue) // 2     # 中点 -> [127,   0, 127]
dark_red = red // 2              # 半亮 -> [127,   0,   0]

RGB 颜色生活在$\mathbb{R}^3$里,混色就是字面意义上的向量算术。

6.3 GPS 简化为几个向量方程

GPS 定位的核心是三球定位:接收机测到自己到几颗已知位置$\vec{s}_i$的卫星的距离$d_i$,得到方程组

$$\|\vec{x} - \vec{s}_i\| \;=\; d_i.$$

在二维情形下,两个方程会留下两个交点,第三个把答案钉死。在三维空间需要四颗卫星(多出来的那颗用来修正接收机时钟偏差)。仅此而已——价值数十亿美元的基础设施,归约成几个向量方程。


七、常见误区

“向量必须从原点出发。” 不必。向量是平移不变的,我们从原点画只是图省事。

“向量就是一列数字。” 一半对。一列数字是向量的一种表示方式。连续函数、多项式、量子态都是向量,但都不能写成有限的一列数字。

“点积和叉积差不多。” 完全不一样。点积输入两个向量、输出一个标量;叉积(只在$\mathbb{R}^3$中存在,$\mathbb{R}^7$里有部分对应物)输入两个向量、输出一个向量。同样的输入位置,截然不同的输出。

“零向量也有方向。” 没有。零向量是唯一一个方向"未定义"的向量——这正是$\vec{v}/\|\vec{v}\|$这样的公式需要单独处理边界情况的原因。


八、本章总结

概念关键想法
向量有大小、有方向的对象——更一般地,是某个向量空间里的元素
加法首尾相接、平行四边形、逐分量——三种画法等价
数乘沿同一条直线拉伸、压缩或反向
内积衡量"对齐程度";代数与几何在此达成共识
投影最佳的一维近似——最小二乘的雏形
范数衡量"大小";不同范数反映不同的优先级
向量空间任何对加法和数乘"听话"的集合——包括函数空间

最大的收获

向量不是一支箭头,也不是一列数字。它是一种模式——一套关于"能加能乘"的小而锋利的规则。一旦你开始留意,就会在图像、信号、量子态、金融组合、神经网络参数、概率分布里反复看见它。线性代数研究的就是这种模式。


九、下一章预告

第 2 章:线性组合与向量空间 中,我们会接着追问:

  • 怎样用一小撮向量搭出整个空间?(张成
  • 这些向量中哪些其实是冗余的?(线性无关
  • 描述一个空间的"最小完备工具箱"是什么样的?(维数

这三个概念会把"一个向量"这个静态对象,升级为"一套坐标系"这种动态结构。


系列导航

Liked this piece?

Follow on GitHub for the next one — usually one a week.

GitHub