系列 · 线性代数 · 第 2 篇

线性代数(二):线性组合与向量空间

如果向量是积木,线性组合就是搭积木的方法。本章讲透线性代数的五个核心词:张成空间、线性无关、基、维度、子空间。

为什么这一章很重要#

打开一盒只有红、绿、蓝三种颜色的蜡笔,你能画出多少种颜色?诚实的答案是无穷多种——你在屏幕上见过的每一种色彩,都不过是这三种原色以不同比例混合而成。仅凭三个“原料”,就能创造出整个色彩宇宙。

线性代数(二):线性组合与向量空间 — 章节概览图

这个配方——选取若干向量,缩放它们,再相加——就叫作线性组合。整个线性代数的大厦,正是建立在这个看似简单的操作之上。一旦你真正理解了它,以下概念也就水到渠成:

  • 张成空间(span):一组向量所能抵达的所有位置;
  • 线性无关:没有任何一个“原料”是多余的;
  • 基(basis):能完整表达空间的最小原料集合;
  • 维度(dimension):描述一个空间所需独立原料的数量;
  • 子空间(subspace):嵌套在更大空间中的小世界。

这五个词构成了线性代数的工作语言。后续所有章节——矩阵、行列式、特征值、SVD——都不过是用这些词汇写成的句子。

阅读前提#

  • 第 1 章 :向量、加法、标量乘法,以及 $\mathbb{R}^2$$\mathbb{R}^3$ 的几何图像。

什么是线性组合?#

配方#

$$c_1 \vec{v}_1 + c_2 \vec{v}_2 + \cdots + c_k \vec{v}_k.$$

仅包含两个操作:先对每个向量进行缩放,再将结果相加。“线性”意味着没有平方项、没有分量间的乘积、也没有非线性函数——只使用向量空间最基本的两种运算。

三个日常图景#

调制鸡尾酒。吧台上放着两种基酒:

  • $\vec{a}=(0.40,\,10)$ :酒精含量 40%,糖分 10 g/L;
  • $\vec{b}=(0.20,\,30)$ :酒精含量 20%,糖分 30 g/L。

你想调配出 $\vec{t}=(0.30,\,20)$ 的饮品。解方程 $x\vec{a}+y\vec{b}=\vec{t}$ 得到 $x=y=0.5$ ,即目标饮品正是线性组合 $0.5\vec{a}+0.5\vec{b}$

行走路线。“向东走 300 米,再向北走 400 米。”你的位移就是线性组合 $300\,\vec{e}_\text{东}+400\,\vec{e}_\text{北}$

$$\text{color}=r\!\begin{pmatrix}255\\0\\0\end{pmatrix}+g\!\begin{pmatrix}0\\255\\0\end{pmatrix}+b\!\begin{pmatrix}0\\0\\255\end{pmatrix}.$$

三种原色,却能生成无穷多色彩。

为何叫“线性”?#

取一个非零向量 $\vec{v}\in\mathbb{R}^2$ 。当标量 $c$ 遍历所有实数时,$c\vec{v}$ 的轨迹是一条过原点的直线。这条直线——标量乘法的几何投影——正是“线性”一词的由来。

若再加入一个不共线的向量 $\vec{w}$ ,画面便从一条直线扩展至整个平面$\mathbb{R}^2$ 中任意一点都可唯一表示为 $a\vec{v}+b\vec{w}$

左图展示了通过平行四边形法则构造的具体组合 $1.5\vec{v}+1.2\vec{w}$ ;右图则显示当 $a$$b$ 自由变化时,这些点铺满了整个平面。

两个向量的线性组合,以及它们生成的网格

张成空间——向量能抵达的所有地方#

定义#

$$\operatorname{span}(\vec{v}_1,\ldots,\vec{v}_k)=\{c_1\vec{v}_1+\cdots+c_k\vec{v}_k\mid c_i\in\mathbb{R}\}.$$

想象每个向量都是遥控器上的一个旋钮。随意调节这些旋钮,所能到达的所有位置合起来就是张成空间。

形状图谱#

向量张成空间
$\mathbb{R}^2$$\mathbb{R}^3$ 中的一个非零向量过原点的直线
两个共线向量仍是那条直线——第二个向量未提供新方向
$\mathbb{R}^2$ 中两个不共线向量整个 $\mathbb{R}^2$
$\mathbb{R}^3$ 中两个不共线向量过原点的平面
$\mathbb{R}^3$ 中三个共面向量仍是那个平面
$\mathbb{R}^3$ 中三个不共面向量整个 $\mathbb{R}^3$

无论何种情况,以下三点恒成立:

  • 张成空间必定经过原点(令所有 $c_i=0$ 即可);
  • 张成空间是封闭的:其中任意两点的线性组合仍在其中;
  • 加入一个已在张成空间内的向量不会扩大该空间。

左图:单个向量张成一条直线。中图:加入一个共线向量,张成空间不变。右图:两个真正不同的方向扫出整个平面。

张成空间的形状:直线、重复的直线、整个平面

实际问题——能配出来吗?#

实验室有三种溶液:

  • $\vec{A}=(5\%,\,10\%)$ (酸/盐)
  • $\vec{B}=(10\%,\,5\%)$
  • $\vec{C}=(2\%,\,2\%)$

能否配出目标浓度 $(15\%,\,12\%)$ ?由于 $\vec{A}$$\vec{B}$ 不共线,$\operatorname{span}(\vec{A},\vec{B})$ 已覆盖整个 $\mathbb{R}^2$ ,因此目标可达。加入 $\vec{C}$ 并不能带来新能力,只会让配方变得不唯一。

线性无关——没有浪费的向量#

核心思想#

有时添加一个向量毫无意义,因为它早已在现有向量的张成空间中。线性无关意味着:每个向量都在贡献自己独特的力量。

定义#

$$c_1\vec{v}_1+\cdots+c_k\vec{v}_k=\vec{0}\;\;\Longrightarrow\;\; c_1=\cdots=c_k=0.$$

若存在非零系数组合也能得到 $\vec{0}$ ,则称这组向量线性相关——至少有一个向量可由其余向量线性表示,因而冗余。

几何诠释#

  • $\mathbb{R}^2$ 中:两向量无关 $\iff$ 不共线;
  • $\mathbb{R}^3$ 中:三向量无关 $\iff$ 不共面;
  • $\mathbb{R}^n$ 中:超过 $n$ 个向量必然相关——因为空间仅有 $n$ 个真正独立的方向。

右图中,$\vec{v}_3=0.8\vec{v}_1+0.6\vec{v}_2$ 。虚线平行四边形揭示了这种依赖关系——$\vec{v}_3$ 未带来新方向,故三者线性相关。

线性无关 vs 线性相关

三种检验方法#

  1. 定义法:求解 $c_1\vec{v}_1+\cdots+c_k\vec{v}_k=\vec{0}$ 。若仅有零解,则无关。
  2. 行列式法(适用于 $\mathbb{R}^n$ 中的 $n$ 个向量):将向量作为列构成方阵,计算行列式。非零 $\Rightarrow$ 无关。
  3. 秩法:将向量作为列构成矩阵,计算秩。若秩等于向量个数,则无关。
1
2
3
4
5
6
7
8
import numpy as np

v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
v3 = np.array([7, 8, 9])      # = 2*v2 - v1,线性相关

A = np.column_stack([v1, v2, v3])
print(np.linalg.matrix_rank(A))   # 输出 2,不是 3,相关

为何线性无关不可或缺?#

$\{\vec{v}_1,\ldots,\vec{v}_k\}$ 线性无关,则其张成空间中的每个向量都有唯一的线性表示。正是这种唯一性,使得坐标具有明确意义:若同一位置可用两套不同系数表示,“$(3,5)$ ”这样的记号就毫无价值了。

基——最小而完整的工具箱#

定义#

向量空间 $V$ 的一组需同时满足:

  1. 线性无关(无冗余);
  2. 张成 $V$ (覆盖空间中所有向量)。

去掉任一向量,覆盖性丧失;增加任一向量,冗余产生。基是最小的张成集,同时也是最大的线性无关集。

$\mathbb{R}^n$ 的标准基#

$$ \vec{e}_1=\!\begin{pmatrix}1\\0\\\vdots\\0\end{pmatrix},\; \vec{e}_2=\!\begin{pmatrix}0\\1\\\vdots\\0\end{pmatrix},\;\ldots,\; \vec{e}_n=\!\begin{pmatrix}0\\\vdots\\0\\1\end{pmatrix}. $$

当你写下 $\vec{v}=(3,5)$ 时,实际意思是 $\vec{v}=3\vec{e}_1+5\vec{e}_2$ 。标准基如此熟悉,以至于我们常忘记它只是众多选择之一。

同一个点 $\vec{u}=(3,2)$ 在左图的标准基下坐标为 $(3,2)$ ,而在右图旋转后的基下坐标则完全不同。箭头本身从未移动,变的只是其下的坐标网格。

线性代数(二):线性组合与向量空间 — 章节小结图

基并非唯一#

$$ \left\{\!\begin{pmatrix}1\\0\end{pmatrix},\!\begin{pmatrix}0\\1\end{pmatrix}\!\right\},\quad \left\{\!\begin{pmatrix}1\\1\end{pmatrix},\!\begin{pmatrix}1\\-1\end{pmatrix}\!\right\},\quad \left\{\!\begin{pmatrix}2\\0\end{pmatrix},\!\begin{pmatrix}0\\3\end{pmatrix}\!\right\}. $$

不同基赋予同一向量不同坐标,但向量本身(几何箭头)始终如一。

坐标依赖于基#

$$4\!\begin{pmatrix}1\\1\end{pmatrix}+(-1)\!\begin{pmatrix}1\\-1\end{pmatrix}=\begin{pmatrix}3\\5\end{pmatrix}.$$

“向量”是几何对象,“坐标元组”则是选定基后看到的样子。这一区分是线性代数中最令人豁然开朗的洞见之一,也正是基变换的核心所在。

标准基 vs 旋转后的基

维度——自由度的计数#

定义#

向量空间 $V$维度 $\dim(V)$ 是其任意一组基中向量的个数。有一条定理(此处暂且接受)保证:所有基的大小相同,因此该定义合理。

三种等价直觉#

维度衡量:

  • 定位一个向量所需的独立参数数量
  • 空间中独立运动方向的数量;
  • 空间所能容纳的最大线性无关向量数
空间维度原因
$\{\vec{0}\}$0无处可去
过原点的直线1仅能前后移动
过原点的平面2前后 + 左右
$\mathbb{R}^3$3再加上下
$\mathbb{R}^n$$n$$n$ 个独立方向

维度定理#

$n$ 维空间中:

  • 超过 $n$ 个向量必然线性相关;
  • 恰好 $n$ 个线性无关向量构成一组基;
  • 少于 $n$ 个向量无法张成整个空间。

正因如此,维度如同空间的容量——它限定了空间内最多能共存多少个独立元素。

子空间——空间中的空间#

定义#

向量空间 $V$子空间 $W$ 是一个非空子集,且自身也构成向量空间。具体而言,$W\subseteq V$ 是子空间当且仅当:

  1. $\vec{0}\in W$
  2. $\vec{u},\vec{v}\in W \implies \vec{u}+\vec{v}\in W$ (对加法封闭);
  3. $\vec{v}\in W,\,c\in\mathbb{R} \implies c\vec{v}\in W$ (对标量乘法封闭)。

条件 2 和 3 表明:加法或缩放不会让你逃出子空间。若 2 和 3 成立且 $W$ 非空,则 1 自动满足(取 $c=0$ ),但显式列出可避免边界情况。

$\mathbb{R}^3$ 中的完整分类#

$\mathbb{R}^3$ 的子空间仅有四类:

  • $\{\vec{0}\}$ —— 维度 0;
  • 任意过原点的直线 —— 维度 1;
  • 任意过原点的平面 —— 维度 2;
  • $\mathbb{R}^3$ 本身 —— 维度 3。

不过原点的直线或平面不是子空间——既不包含 $\vec{0}$ ,也不对加法封闭。

同一个点,两套坐标网格

张成空间必为子空间#

对任意向量集 $S=\{\vec{v}_1,\ldots,\vec{v}_k\}$$\operatorname{span}(S)$ 自动构成子空间。这是构造子空间最直接的方法:选一些向量,取其张成空间,即得子空间。几乎所有遇到的子空间都由此而来。

线性 vs 仿射——原点为何关键#

不过原点的直线是仿射集,而非线性子空间。下图清晰展示了区别:左图中 $\vec{u}+\vec{w}$ 仍在直线上;右图中 $\vec{p}_1+\vec{p}_2$ 则直接跳出直线。

3D 中的子空间:过原点的直线、过原点的平面

这正是仿射几何(含平移)与线性代数(仅含旋转与缩放)的根本差异。线性映射固定原点,仿射映射则不然。今后见到“子空间”,请直接理解为“过原点且对加法与数乘封闭”。

子空间和的维度公式#

$$\dim(U+W)=\dim(U)+\dim(W)-\dim(U\cap W).$$

这正是容斥原理在向量空间中的体现。第 5 章 讨论线性方程组解的结构时,我们将再次遇见此公式。

子空间必须过原点:线性 vs 仿射

案例研究:RGB 作为向量空间#

RGB 色彩模型是本章所有概念最干净的现实映射:

  • 每种颜色是一个三维向量 $\vec{c}=(r,g,b)$
  • 基为三种原色 $\{\vec{r},\vec{g},\vec{b}\}$
  • $\dim(\text{RGB})=3$ —— 三个独立通道,三个调节旋钮。
1
2
3
4
5
6
7
import numpy as np

red, green, blue = np.eye(3) * 255

yellow = red + green          # [255, 255,   0]
purple = red + blue           # [255,   0, 255]
white  = red + green + blue   # [255, 255, 255]

灰度是一维子空间:$\vec{c}=k(1,1,1)$ ,其中 $k\in[0,255]$ —— 仅一个旋钮、一个自由度,沿 RGB 立方体对角线分布。

色盲(某些类型)将 RGB 投影到二维子空间:缺失的维度正是患者无法分辨的方向。

色彩空间转换(如 RGB → HSV、LAB)本质上是基变换:颜色不变,坐标系更新。


常见陷阱#

$\vec{v}_1=(1,2)$$\vec{v}_2=(2,4)$ 张成 $\mathbb{R}^2$ 。” 错。$\vec{v}_2=2\vec{v}_1$ ,故它们仅张成直线 $y=2x$

“三个向量总比两个张成更大空间。” 仅当第三个向量不在前两者张成空间中时才成立。

“线性无关向量必互相垂直。” 否。$(1,0)$$(1,1)$ 线性无关但不正交。正交是比无关更强的条件。

“一个空间有唯一基。” 每个空间都有无穷多组基。唯一确定的是维度——即任意基中向量的数量。

“任意子集都是子空间。” 子空间必须包含 $\vec{0}$ 且对加法与数乘封闭。大多数子集均不满足。


代码实验#

判断向量组是否线性无关#

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

def is_independent(vectors):
    """判断给定向量组是否线性无关"""
    A = np.column_stack(vectors)
    return np.linalg.matrix_rank(A) == len(vectors)

print(is_independent([np.array([1, 2, 3]),
                      np.array([4, 5, 6]),
                      np.array([7, 8, 9])]))   # False
print(is_independent(list(np.eye(3))))         # True

判断目标向量是否在张成空间中#

1
2
3
4
5
6
7
8
9
def in_span(target, vectors, tol=1e-8):
    """判断目标向量是否在生成空间内"""
    A = np.column_stack(vectors)
    coeffs, *_ = np.linalg.lstsq(A, target, rcond=None)
    return np.allclose(A @ coeffs, target, atol=tol)

v1, v2 = np.array([1, 1]), np.array([2, 2])     # 共线
print(in_span(np.array([1, 0]), [v1, v2]))      # False
print(in_span(np.array([3, 3]), [v1, v2]))      # True

从冗余向量组中提取基#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def extract_basis(vectors):
    """贪心算法:只保留能提升矩阵秩的向量"""
    chosen, M = [], np.zeros((len(vectors[0]), 0))
    for v in vectors:
        Mtest = np.column_stack([M, v])
        if np.linalg.matrix_rank(Mtest) > M.shape[1]:
            chosen.append(v)
            M = Mtest
    return chosen

vs = [np.array([1, 0, 0]),
      np.array([0, 1, 0]),
      np.array([1, 1, 0]),    # = v1 + v2  ——冗余
      np.array([0, 0, 1])]
print(len(extract_basis(vs)))   # 3 -> {v1, v2, v4}

总结#

概念定义直观图像
线性组合$c_1\vec{v}_1+\cdots+c_k\vec{v}_k$向量的加权和
张成空间所有线性组合所有可达点
线性无关零组合 $\Rightarrow$ 系数全零无冗余箭头
无关 张成空间最小完整工具箱
维度任意基的大小自由度数量
子空间$\vec{0}$ ,对 $+$$\cdot$ 封闭空间中的空间

这六大概念贯穿后续全部内容:

  • 第 3 章 :矩阵的列空间即其列向量的张成空间
  • 第 4 章 行列式用单个数值检验线性无关性;
  • 第 5 章 :方程 $A\vec{x}=\vec{0}$ 的解集是子空间(零空间);
  • 第 6 章 特征向量是能对角化矩阵的特殊基;
  • 第 9 章 SVD 提供一对“最优”的标准正交基。

当基假设失效:近似相关的列#

“向量要么无关要么相关”这一清晰二分,在浮点运算面前并不成立。实践中,列向量往往是近似相关的,表现为基矩阵的行列式并非 0,而是 $10^{-15}$ 量级。

例如,考虑三列长度为 100 的向量,其中第三列为前两列之和加上微小噪声:

1
2
3
4
5
6
7
8
9
import numpy as np
rng = np.random.default_rng(0)
v1 = rng.standard_normal(100)
v2 = rng.standard_normal(100)
v3 = v1 + v2 + 1e-10 * rng.standard_normal(100)
A = np.column_stack([v1, v2, v3])
print(np.linalg.matrix_rank(A))           # 3 —— 看似"独立"
print(np.linalg.matrix_rank(A, tol=1e-8)) # 2 —— 实际上并非如此
print(np.linalg.svd(A, compute_uv=False)) # [~14, ~10, ~1e-9]

matrix_rank 默认基于最大奇异值设定容差。严格计算时秩为 3,但第三奇异值仅为 $10^{-9}$ ——该列在数值上已实质冗余。若用此矩阵求解 $A^TA$ 的逆,结果会爆炸:条件数高达 $\sim 10^{10}$

正确工具是 SVD(第 9 章 )。奇异值 $\sigma_1 \ge \sigma_2 \ge \cdots$ 连续度量列的“独立程度”。比值 $\sigma_1/\sigma_n$ 即条件数;在双精度下,若该比值超过 $10^8$ ,此“基”便不可用。数值秩定义为大于阈值(通常为 $\max(m,n)\cdot \varepsilon \cdot \sigma_1$ )的奇异值个数。

此类问题屡见不鲜。例如,在 $x \in [0,1]$ 上对 $1, x, x^2, \ldots, x^{15}$ 做多项式回归,条件数超 $10^{20}$ ——单项式基理论上无关,实践中却完全失效。改用 Chebyshev 或 Legendre 多项式,条件数骤降至 $\sim 10^2$张成空间相同,基的选择却天壤之别

与机器学习的联系:特征冗余与数据矩阵的秩#

在表格型机器学习流程中,设计矩阵 $X \in \mathbb{R}^{n\times d}$ 每行对应样本,每列对应特征。$X$列空间即线性模型能表示的所有标签函数集合。本章术语可精准诊断以下三类问题:

  1. One-hot 共线性:将 $k$ 类别变量 one-hot 编码为 $k$ 列时,这些列之和等于全 1 列,导致线性相关,秩减 1。线性回归的正规方程 $X^TX \beta = X^T y$ 因此奇异。解决方法:删除一列(避免“虚拟变量陷阱”)或添加 L2 正则。

  2. 冗余构造特征:同时加入 height_cmheight_mheight_inches,实际仅引入一个特征。张成空间未扩展。树模型不受影响;线性模型则因矩阵不可逆而给出无意义系数。

  3. PCA = 选取最优低维子空间:PCA 寻找 $\mathbb{R}^d$ 中能捕获最大方差的 $k$ 维子空间——即前 $k$ 个主方向的张成空间。这本质上是在回答:“我的数据云的最佳 $k$ 维基是什么?”答案由 SVD 给出。将 1000 维特征降至 50 维,相当于用数据自选的基替代人工定义的基。

因此,当本章提及“基”与“维度”时,在机器学习中的解读是:基是假设空间的参数化方式,维度是其容量。选择基是建模决策,而非记账琐事


下一步#

第 3 章 :矩阵即线性变换。矩阵并非静态数字表,而是变换的执行者。我们将看到:

  • $A\vec{x}$ 的几何意义是 $A$$\vec{x}$ 的作用;
  • 旋转、缩放、剪切、投影皆可用矩阵表示;
  • 矩阵乘法即变换的复合
  • 矩阵 $A$ 的列空间正是本章定义的张成空间。
本系列

线性代数 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