系列 · 线性代数 · 第 1 篇

线性代数(一):向量的本质——不仅仅是箭头

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

为什么要学向量?#

物理学家谈论“力”,数据科学家谈论“特征”,游戏程序员谈论“速度”,量子理论家谈论“态”。不同领域,不同术语——但背后指向的是同一个数学对象:向量

线性代数(一):向量的本质——不仅仅是箭头 — 章节概览图

这绝非巧合。向量是最简单却足够灵活的数学对象,能描述任何可以相加和缩放的东西。一旦你识别出这个模式,就会发现它无处不在。

大多数入门课程对“什么是向量”给出两个答案:

  • “空间中一个有长度和方向的箭头。”
  • “一组有序的数字。”

两者都正确,但都不完整。完整的故事是:向量就是存在于向量空间中的任意对象——一个支持加法和数乘运算的集合。箭头和数字列表是最常见的例子;函数、信号、多项式、量子态同样合法。

本章将从具体走向抽象,依次展开四个层次:

  1. 几何视角——可绘制的箭头。
  2. 数值视角——可用于计算的数字列。
  3. 结构视角——内积,融合前两者。
  4. 公理视角——适用于任何此类对象的通用规则。

你将学到什么#

  • 如何从几何(箭头)和数值(列表)两个角度理解向量
  • 三种基本运算:加法、数乘、减法
  • 点积——代数与几何如何一致地定义“对齐”
  • 多种度量大小的方式(范数),以及为何需要不止一种
  • 向量空间的公理化定义——为何函数也能是向量

前置知识#

  • 中学代数
  • 平面直角坐标系($x$$y$ 平面)
  • 勾股定理

一、几何视角:向量即箭头#

从行走指令到向量#

站在公园中心(设为原点)。朋友说:“向东走 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. $$

因此,一个向量将长度方向这两条几何信息打包成单一对象。

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

平移不变性:向量没有“家”#

初学者常感惊讶的第一个概念是:向量不关心起点在哪。无论你从公园中心还是东北角画出“4 东、3 北”,它都是同一个向量。只有方向和长度是不变量。

速度是最清晰的例子。一艘以 20 节航速向东行驶的船,无论在太平洋中央还是西班牙海岸附近,其速度向量都相同。位置每分钟都在变,速度向量却不变。

正因如此,绘图时我们常将向量锚定在原点——这是便利,而非约束。

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

向量加法:同一事物的三种图景#

给定两个向量 $\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}. $$

用几何图景去理解,用分量去做计算——它们是一枚硬币的两面。

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

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

将向量 $\vec{v}$ 乘以一个数(标量$c$ ,会沿其自身直线重新缩放。行为分为四种情形:

  • $c > 1$ :箭头在原方向上拉伸。
  • $0 < c < 1$ :在原方向上收缩。
  • $c = 0$ :坍缩为零向量
  • $c < 0$反向,并按 $|c|$ 缩放。

所有非零向量的标量倍数构成一条过原点的直线——这是你首次接触张成(span)的概念,将在第 2 章 深入探讨。

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

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}$ 则是以相同速度掉头。

向量减法:“从此处到彼处”#

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

游戏引擎频繁使用此操作:玩家到目标的位移、子弹飞行方向、两个航点间的偏移——全都是位置向量的差。


二、数值视角:向量即数据#

超越二维与三维#

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

你无法想象 100 维的箭头,但所有运算——加法、缩放、点积、范数——都无缝延续。这正是从“可见几何”迈向“仅可计算几何”的桥梁。

同一对象,三种视角#

以下五个数 $\{25.3,\,65.0,\,1013,\,15.2,\,45\}$ ,从三个传统视角看,本质是同一个向量。

同一个向量的三种视角:箭头、特征向量、列向量

物理学:物理空间中的箭头,如速度或力。

计算机科学特征向量——一行测量值刻画一个样本,此处表示某时刻的天气状况(温度、湿度、气压、风速、云量)。

数学:一列实数,属于 $\mathbb{R}^5$

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

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  -- 更接近!

自然语言处理中的著名例子更进一步:单词被训练为 300 维向量,使得 $\text{king} - \text{man} + \text{woman} \approx \text{queen}$ 。向量运算竟能捕捉语义。


三、内积:几何与代数的交汇#

线性代数(一):向量的本质——不仅仅是箭头 — 章节小结图

内积(在 $\mathbb{R}^n$ 中也称点积)是本章最深刻的单一运算。它隐藏着一个小奇迹:两个看似毫不相关的定义,竟给出相同的数值。

两种定义,同一运算#

$$ \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. $$ $$ \vec{a} \cdot \vec{b} \;=\; \|\vec{a}\|\,\|\vec{b}\|\,\cos\theta, $$

其中 $\theta$$\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.]

正交性:几何化的独立性#

$\vec{a} \cdot \vec{b} = 0$ 时,两向量正交(垂直),记作 $\vec{a} \perp \vec{b}$ 。几何上意味着 90 度夹角。为何值得专门命名?

  • 几何:正交方向互不干扰——沿其一移动,不会改变在另一方向上的投影。
  • 统计:不相关的随机变量对应正交向量(协方差 $= 0$ )。
  • 计算:正交基将问题解耦为独立的一维子问题。数值线性代数中几乎所有“高效”技巧都依赖正交性。

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$ 范数。但它并非唯一,选择不同范数会改变问题的几何特性。

三种最常见范数#

范数公式直观
$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$ 用于只关心最坏分量而非平均的情形——鲁棒控制、误差界、最大误差保证。

单位球:范数的几何指纹#

观察范数的清晰方式是绘制其单位球——所有范数为 1 的向量集合。三种范数,三种迥异形状:

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

菱形在坐标轴上的尖角正是 $L^1$ 产生稀疏解的原因:当在菱形约束下最小化目标函数时,最优解倾向于落在尖角上,这意味着若干坐标为零。

一个令人安心的定理——范数等价性——指出:在有限维空间中,所有范数在定性上可互换:序列在一范数下收敛当且仅当在所有范数下收敛。数值不同,拓扑不变。


五、抽象视角:公理化的向量空间#

至此,“向量”意指“箭头”或“数字列”。但数学家注意到:许多截然不同的对象——箭头、多项式、连续函数、随机变量、量子态——都遵循相同规则。于是他们将这些规则提炼为定义。

定义#

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

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

满足十条公理(加法交换律与结合律、零向量与加法逆元存在性、分配律、标量乘法结合律及单位元)。公理是细则,精神可归为一句:

任何可相加、可缩放且遵守常规代数规则的对象,都是向量。

意想不到的向量空间#

连续函数$[0,1]$ 上所有连续函数构成向量空间:逐点相加 $(f+g)(x) = f(x) + g(x)$ ;逐点缩放 $(cf)(x) = c\,f(x)$ ;零向量是恒零函数。此空间是无限维的——可视为每个 $x \in [0,1]$ 对应一个坐标的向量。

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

矩阵:所有 $m \times n$ 矩阵构成 $mn$ 维向量空间;加法与缩放均为逐元素操作。

量子态:量子态是复 Hilbert 空间中的单位向量。“叠加态”不过是穿了燕尾服的向量加法。

抽象的价值#

一旦在公理层面证明定理,它便适用于所有满足公理的场景:

  • Cauchy–Schwarz 不等式适用于列向量、函数空间随机变量(此时变为协方差不等式 $|\operatorname{Cov}(X,Y)| \le \sigma_X \sigma_Y$ )。一定理,三领域。
  • 傅里叶分析即“将函数分解为正交基向量的线性组合”——与第 7 章 对列向量的操作完全一致。
  • 量子力学即“在无限维内积空间中研究物理”。

这正是线性代数的深层回报:掌握结构一次,终身应用


六、现实中的向量#

五行代码实现游戏物理#

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 次。

调色即向量加法#

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$ 中。混合颜色本质上就是向量运算。

GPS 定位简化为向量方程#

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

在平面中,两个方程给出两个交点;第三个确定唯一解。在三维中,需四颗卫星(第四颗用于钟差校正)。仅此而已——价值数十亿美元的基础设施,表达为向量方程。


七、常见陷阱#

“向量必须从原点出发。” 错。向量平移不变;从原点画仅为方便。

“向量就是一串数字。” 半对。数字串是向量的一种表示。连续函数、多项式、量子态也是向量,却无法写成有限数字列。

“点积与叉积类似。” 不然。点积取两向量返回标量;叉积(仅存于 $\mathbb{R}^3$$\mathbb{R}^7$ 有类似物)取两向量返回向量。输入相同,输出迥异。

“零向量有方向。” 否。零向量是唯一无明确定义方向的向量——这正是 $\vec{v}/\|\vec{v}\|$ 等公式需特殊处理的原因。


九、后续内容#

第 2 章 :线性组合与向量空间 中,我们将探讨几个自然问题:

  • 如何用少量向量构建整个空间?(张成
  • 何时某些向量是冗余的?(线性无关
  • 描述空间所需的最小“完整工具箱”是什么?(维数

这三个概念将“向量”的静态概念转化为“坐标系”的动态概念。

八、总结#

概念核心思想
向量有大小与方向的对象——更广义地,向量空间中的元素
加法首尾相接、平行四边形或分量相加——三者等价
标量乘法沿同一直线拉伸、收缩或反向
内积度量对齐程度;代数与几何在此一致
投影最佳一维近似——最小二乘的原型
范数度量大小;不同范数反映不同优先级
向量空间任意满足加法与缩放公理的集合——包括函数空间

核心洞见#

向量不是箭头,也不是数字列。它是一种模式——一套简洁而锋利的“可加可缩”规则。一旦你开始留意,就会在图像、信号、量子态、金融组合、神经网络参数、概率分布中处处发现它。线性代数研究的正是这一模式。


数值稳定性:向量运算在代码中失效之时#

我想指出一个常被忽视的问题:教科书公式 $\cos\theta = \vec{u}\cdot\vec{v} / (\|\vec{u}\|\,\|\vec{v}\|)$ 并非计算两向量夹角的安全方法。试试这对几乎平行的单位向量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np
u = np.array([1.0, 1e-8])
v = np.array([1.0, 0.0])
c = np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))
print(c)            # 0.9999999999999999
print(np.arccos(c)) # 1.4901161193847656e-08  -- 正确结果
u2 = np.array([1.0, 0.0])
v2 = np.array([1.0, 1e-9])
c2 = np.dot(u2, v2) / (np.linalg.norm(u2) * np.linalg.norm(v2))
print(np.arccos(c2)) # 0.0  -- 错了,真实角度是 1e-9

发生了什么?norm 内部对分量平方,使小量 $10^{-9}$ 变为 $10^{-18}$ ,低于双精度在 1 附近的分辨率(约 $2.22 \times 10^{-16}$ )。于是 $c$ 舍入为精确 1,而 arccos(1) = 0

$$ \theta = \operatorname{atan2}\bigl(\|\vec{u}\times\vec{v}\|,\ \vec{u}\cdot\vec{v}\bigr). $$

atan2 对极小或接近 $\pi$ 的角度均保持全精度。同理适用于:Gram-Schmidt(用修正版或 Householder,勿用经典版)、方差计算(用 Welford 在线公式,勿用 $E[X^2] - (E[X])^2$ )、softmax(先减最大值)。

关键点:本章所学代数在 $\mathbb{R}$ 上精确,但每行代码运行于 $\mathbb{F}_{64}$ ——一个约含 $2^{64}$ 个有理数的有限集。抵消、溢出、舍入非边缘情况——它们决定模型能否训练。

np.dot 的真实运作#

当你对两个一维数组调用 np.dot(u, v) 时,NumPy 不会执行 Python 循环。它会分派至 BLAS Level 1 例程——通常是 OpenBLAS、MKL 或 Apple Accelerate 提供的 cblas_ddot,以手工优化的 C 或汇编编写。对长度 $n$ 的向量,该例程:

  1. 检查对齐与步长。若两数组连续,则走快速路径。
  2. 将循环拆为 4 或 8 元素块,利用 SIMD 指令(x86 上 AVX2/AVX-512,ARM 上 NEON),单条 CPU 指令并行完成 4 或 8 个双精度乘加。
  3. 独立寄存器中累加部分和以打破依赖链,最后合并。这比朴素顺序求和快 4–8 倍,且——略反直觉——会改变比特级精确结果,因浮点加法不满足结合律。

开销:$\Theta(n)$ FLOPs 与 $\Theta(n)$ 内存读取。现代笔记本上处理 $10^6$ 长向量时,应达 5–10 GFLOPS,耗时约 0.1 毫秒。若实测慢得多,说明 NumPy 未走 BLAS 路径——通常因非连续切片(如 u[::2])或 object dtype。

同理可推广。A @ B$n \times n$ 矩阵调用 dgemm(BLAS Level 3),使用分块算法将数据保留在 L1/L2 缓存。这正是手写 Python 三重循环比 NumPy 慢千倍的原因——非因 Python 单次乘法慢,而是无法像 dgemm 那样高效利用缓存。

因此,本章说“内积即 $\sum u_i v_i$ ”在数学上成立。但实际中,np.dot 是你调用过的最高度优化的软件之一。信任它,勿重造。


本系列

线性代数 18 篇

  1. 01 线性代数(一):向量的本质——不仅仅是箭头 当前
  2. 02 线性代数(二):线性组合与向量空间
  3. 03 线性代数(三):矩阵作为线性变换
  4. 04 线性代数(四):行列式的秘密
  5. 05 线性代数(五):线性方程组与列空间
  6. 06 线性代数(六):特征值与特征向量
  7. 07 线性代数(七):正交性与投影——当向量互不干扰
  8. 08 线性代数(八):对称矩阵与二次型
  9. 09 线性代数(九):奇异值分解 SVD
  10. 10 线性代数(十):矩阵范数与条件数——数值计算的健康体检
  11. 11 线性代数(十一):矩阵微积分与优化——从梯度到反向传播
  12. 12 线性代数(十二):稀疏矩阵与压缩感知——少即是多的数学奇迹
  13. 13 线性代数(十三):张量与多线性代数——从标量到高维数据立方体
  14. 14 线性代数(十四):随机矩阵理论——混沌中的秩序
  15. 15 线性代数(十五):机器学习中的线性代数——从 PCA 到推荐系统
  16. 16 线性代数(十六):深度学习中的线性代数——从全连接到 Transformer
  17. 17 线性代数(十七):计算机视觉中的线性代数——从像素到三维重建
  18. 18 线性代数(十八):前沿应用与总结——量子计算、GNN、大模型,与十八章回望

读有所得?

GitHub 关注我 → 新文周更

GitHub