Series · Linear Algebra · Chapter 2

线性组合与向量空间

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

写在前面:为什么这一章很重要

打开一盒只有红、绿、蓝三种颜色的彩笔,你能画出多少种颜色?答案是无穷多种——你在屏幕上看见的每一种颜色,本质上都是这三支笔按不同比例混合的结果。三个"原料",撑起整个色彩宇宙。

这套配方——取几个向量,先放缩、再相加——就叫线性组合。整个线性代数,全靠这一个动作搭起来。把它真正想透,下面这几个词也就同时被你理解了:

  • 张成空间(span)——一组向量能"够到"的所有地方;
  • 线性无关——这组向量里没有任何一个是多余的;
  • 基(basis)——最小的一套完整原料;
  • 维度(dimension)——这个空间需要多少个独立原料;
  • 子空间(subspace)——大空间里嵌套的小空间。

这五个词,是线性代数的"日常用语"。后面所有章节——矩阵、行列式、特征值、SVD——都是用这套词写出来的句子。

阅读前提

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

1. 什么是线性组合

一句话说清

给定向量 $\vec{v}_1,\vec{v}_2,\ldots,\vec{v}_k$ 和实数 $c_1,c_2,\ldots,c_k$,它们的线性组合

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

只用两个动作:先放缩,再相加。“线性"这个词的潜台词是——没有平方、没有分量相乘、没有任何非线性函数,只有这两个最基本的运算。

三个生活化的例子

调鸡尾酒。 吧台有两瓶基酒:

  • $\vec{a}=(0.40,\,10)$:40 度,每升 10 克糖;
  • $\vec{b}=(0.20,\,30)$:20 度,每升 30 克糖。

你想要 $\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{颜色}=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$ 在 $\mathbb{R}$ 上跑遍,所有 $c\vec{v}$ 串起来就是一条过原点的直线。这条直线,正是"标量乘法"的几何影子,也正是"线性"这个词的出处。

再加上一个不与之共线的 $\vec{w}$,画面立刻从"一条线"炸开成"整个平面”:$\mathbb{R}^2$ 中任何一个点 $\vec{u}$,都能唯一地写成 $a\vec{v}+b\vec{w}$。

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

左图:用平行四边形法则构造 $1.5\vec{v}+1.2\vec{w}$ 这一个具体组合。右图:让 $a$、$b$ 取遍所有实数,得到的点把整个平面"铺满”。


2. 张成空间——向量"够得到"的所有地方

定义

向量 $\vec{v}_1,\ldots,\vec{v}_k$ 的张成空间(span)是它们所有线性组合构成的集合:

$$ \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}\}. $$

可以想象成:每个向量是遥控器上的一个旋钮,你随便拧,最终能到达的所有位置就是 span。

各种情形一览

向量span 的形状
$\mathbb{R}^2$ 或 $\mathbb{R}^3$ 中一个非零向量过原点的一条直线
两个共线的向量仍然是那条直线——第二个没贡献新方向
$\mathbb{R}^2$ 中两个不共线的向量整个 $\mathbb{R}^2$
$\mathbb{R}^3$ 中两个不共线的向量过原点的一个平面
$\mathbb{R}^3$ 中三个共面向量仍然是那个平面
$\mathbb{R}^3$ 中三个不共面向量整个 $\mathbb{R}^3$

无论怎么选,下面三件事一定成立:

  • span 必然过原点——所有 $c_i=0$ 时就是 $\vec{0}$;
  • span 是封闭的:里面任意两个点的线性组合还在里面;
  • 加进一个已经够得到的向量,span 不会变大。

Span 的形状:直线、重复的直线、整个平面

左:一个向量张成一条直线。中:一个共线的"伙伴"没有贡献新方向,span 不变。右:两个真正不同的方向把整个平面扫出来。

一个实际问题——能不能配出来?

实验室有三种溶液:

  • $\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}$ 加不加都没区别——它只会让"配方"不再唯一。


3. 线性无关——没有一个向量是多余的

核心想法

有时候多加一个向量并不能"扩张"空间,因为它本来就在 span 里。线性无关说的就是:每一个向量都贡献了真正属于自己的方向,没有谁是凑数的。

定义

向量 $\vec{v}_1,\ldots,\vec{v}_k$ 线性无关当且仅当:把零向量写成它们的组合,只有全零这一种系数:

$$ 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$ 个向量一定相关——独立方向最多就这么多。

线性无关 vs 线性相关

右图里 $\vec{v}_3=0.8\vec{v}_1+0.6\vec{v}_2$,虚线平行四边形把这种"凑出来"的关系画了出来——$\vec{v}_3$ 完全没贡献新方向,所以三个向量线性相关。

三种判定方法

  1. 定义法。 解 $c_1\vec{v}_1+\cdots+c_k\vec{v}_k=\vec{0}$;只有零解则无关。
  2. 行列式法(仅适用于 $\mathbb{R}^n$ 中的 $n$ 个向量)。把它们作为列拼成方阵,$\det\neq 0$ 即无关。
  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\}$ 线性无关,那么 span 中的每一个向量都只有唯一一种写法。这种"唯一性"才让坐标这件事有意义——如果同一个点能用两套不同的系数写出来,"$(3,5)$" 这个记号就没法定义了。


4. 基——最小而完整的工具箱

定义

向量空间 $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$。标准基太熟悉了,以至于我们经常忘了它其实只是一种选择

标准基 vs 旋转后的基

同一个点 $\vec{u}=(3,2)$,在左边标准基下坐标是 $(3,2)$,在右边旋转后的基下坐标完全不同。箭头本身没动,是它脚下的"网格"换了。

基不止一种

下面三组都是 $\mathbb{R}^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\}. $$

不同的基会给同一个向量赋予不同的坐标,但向量本身(那个几何箭头)一动也不动。

坐标依赖于基

向量 $(3,5)$ 在标准基下坐标是 $(3,5)$,在基 $\{(1,1),(1,-1)\}$ 下坐标变成 $(4,-1)$,因为

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

把这件事想透:向量是几何对象,坐标元组是你"挑了一组基之后"看到的样子。 这是线性代数中最释然的一个观念——它就是"基变换"在做的事情。

同一个点,两套坐标网格


5. 维度——空间里的"自由度"

定义

向量空间 $V$ 的维度 $\dim(V)$ 等于 $V$ 任意一组基的向量个数。背后有一条定理保证:同一个空间的所有基个数相同——这一点我们暂时接受为事实。

三种等价的直觉

维度数的是:

  • 描述一个向量需要多少个独立参数
  • 空间里有多少个独立的运动方向
  • 这个空间最多能装下多少个线性无关的向量。
空间维度解释
$\{\vec{0}\}$0哪儿都去不了
过原点的直线1只能前后移动
过原点的平面2前后 + 左右
$\mathbb{R}^3$3再加上下
$\mathbb{R}^n$$n$$n$ 个独立方向

维度定理

在 $n$ 维空间中:

  • 超过 $n$ 个向量必然相关;
  • 恰好 $n$ 个无关向量构成一组基;
  • 不到 $n$ 个向量不可能张成整个空间。

这就是为什么"维度"读起来像是空间的容量——它给"独立的事物能共存多少个"画了一条上限。


6. 子空间——空间中的空间

定义

向量空间 $V$ 的一个子空间 $W$,是 $V$ 的一个非空子集,自身也是一个向量空间。具体说,$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$ 的子空间一共只有四类

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

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

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

Span 自动给出子空间

对任意一组向量 $S=\{\vec{v}_1,\ldots,\vec{v}_k\}$,$\operatorname{span}(S)$ 一定是子空间。这是构造子空间最朴素的办法:挑几个向量,取它们的 span,就有一个子空间。你日后遇到的子空间,几乎都是这么造出来的。

“线性"和"仿射”——为什么过原点这么重要

不过原点的直线叫仿射集(affine set),而不是线性子空间。下面这张图把区别画得很干净:左边 $\vec{u}+\vec{w}$ 仍然在直线上;右边 $\vec{p}_1+\vec{p}_2$ 直接跳出了直线。

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

这正是仿射几何(带平移)和线性代数(只有旋转和缩放)的分水岭。线性变换固定原点,仿射变换不固定。以后看到"子空间",请下意识地翻译成"过原点 + 加法和数乘都封闭"。

维度公式

对两个子空间 $U,W\subseteq V$:

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

这就是容斥原理在向量空间中的搬运版。第 5 章数线性方程组解的个数时,我们会再次用到它。


7. 实战案例:把 RGB 看作向量空间

RGB 颜色模型,是把这一章所有概念串起来的最干净的现实例子:

  • 每种颜色是 3 维向量 $\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]

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

色盲(某些类型)相当于把 RGB 投影到一个 2 维子空间——丢掉的那一维,正是色盲患者无法分辨的方向。

颜色空间转换(RGB → HSV、LAB……)就是基变换:颜色没变,换了套坐标。


8. 容易踩的坑

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

“三个向量一定比两个张成更大的空间。” 不一定。如果第三个向量本来就在前两个的 span 里,空间不变。

“线性无关的向量一定垂直。” 错。$(1,0)$ 和 $(1,1)$ 无关但不正交。正交是比无关更强的条件。

“基是唯一的。” 同一个空间有无穷多组基。唯一的是维度——任意一组基的向量个数

“任何子集都是子空间。” 子空间必须含 $\vec{0}$,并对 $+$ 和数乘都封闭。绝大多数子集都不满足。


9. 代码实战

判断是否线性无关

 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

判断目标向量是否在 span 中

1
2
3
4
5
6
7
8
9
def in_span(target, vectors, tol=1e-8):
    """判断 target 是否在 span(vectors) 中。"""
    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}

10. 本章小结

概念定义形象
线性组合$c_1\vec{v}_1+\cdots+c_k\vec{v}_k$向量的加权求和
张成空间所有线性组合能到达的所有位置
线性无关零组合 $\Rightarrow$ 系数全零没有冗余的箭头
无关 张成空间最小完整工具箱
维度任意一组基的大小自由度
子空间含 $\vec{0}$、对加法和数乘封闭空间中的空间

这六个概念会贯穿后面所有内容:

  • 第 3 章 —— 矩阵的列空间就是它列向量的 span;
  • 第 4 章 —— 行列式用一个数判断线性无关;
  • 第 5 章 —— $A\vec{x}=\vec{0}$ 的解集是子空间(零空间);
  • 第 6 章 —— 特征向量是把矩阵对角化的特殊基;
  • 第 9 章 —— SVD 给出"最优"的一对正交基。

下一章预告

第 3 章:矩阵作为线性变换。 矩阵不是被动的数字表格,而是变换的代理人。我们将看到:

  • $A\vec{x}$ 的几何含义就是 $A$ 对 $\vec{x}$ 的"作用";
  • 旋转、缩放、剪切、投影——全都是矩阵;
  • 矩阵乘法 = 变换的复合;
  • 矩阵 $A$ 的列空间正是本章定义的 span。

系列导航

Liked this piece?

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

GitHub