向量空间与线性变换【选修】

选修章节
本节内容帮助你加深理解。如果你只想快速上手 AI 项目,可以先跳过,后续遇到相关概念再回来看。
学习目标
- 理解线性无关、基、维度的含义
- 理解线性变换的矩阵表示
- 直觉理解奇异值分解(SVD)
先说一个很重要的学习预期
这一节是选修,名字也更抽象,所以新人特别容易一上来就掉速。
你这节最重要的目标,不是把线性代数高级理论全部吃透,而是先建立一个更高层的视角:
- 前面那些向量、矩阵、特征值,到底在更大框架里分别是什么
- 为什么“维度、基、线性无关”这些词会在后面的 AI 里反复出现
- 为什么 SVD 会成为很多方法的底层工具
也就是说,这一节更像:
把前面三节的直觉整理成一个更高层的理解框架。
这节和前面三节是什么关系?
如果你前面三节学的是“向量怎么表示、矩阵怎么变换、特征值怎么找特殊方向”,那这一节就是把这些内容抬高一个视角来重新看。
所以这节课更像“加深理解的整理课”,不是必须第一时间全部吃透,但学懂之后,你会更知道前面那些概念为什么成立。
一、线性无关——"不冗余"的向量
1.1 什么是线性无关?
直觉:一组向量是"线性无关"的,意味着每个向量都提供了独特的信息,没有谁是多余的。
1.1.1 一个更适合新人的类比
可以先把“线性无关”想成团队分工:
- 如果团队里每个人都带来不同能力,那就是不冗余
- 如果两个人做的是同一件事,其中一个其实就有点重复了
所以线性无关最值得先记的,不是严谨定义,而是这句:
这组向量里,有没有谁其 实是在重复别人已经表达过的信息。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
# 线性无关的例子:向右 和 向上,方向完全不同
v1 = np.array([1, 0])
v2 = np.array([0, 1])
# 线性相关的例子:v2 只是 v1 的 2 倍,方向完全一样
u1 = np.array([1, 2])
u2 = np.array([2, 4]) # u2 = 2 * u1,冗余!
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 线性无关
ax = axes[0]
ax.quiver(0, 0, v1[0], v1[1], angles='xy', scale_units='xy', scale=1,
color='steelblue', width=0.01, label='v1 = [1, 0]')
ax.quiver(0, 0, v2[0], v2[1], angles='xy', scale_units='xy', scale=1,
color='coral', width=0.01, label='v2 = [0, 1]')
ax.set_xlim(-0.5, 2)
ax.set_ylim(-0.5, 2)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
ax.legend()
ax.set_title('线性无关\n两个方向不同,无冗余')
# 线性相关
ax = axes[1]
ax.quiver(0, 0, u1[0], u1[1], angles='xy', scale_units='xy', scale=1,
color='steelblue', width=0.01, label='u1 = [1, 2]')
ax.quiver(0, 0, u2[0], u2[1], angles='xy', scale_units='xy', scale=1,
color='coral', width=0.01, label='u2 = [2, 4]')
ax.set_xlim(-0.5, 3)
ax.set_ylim(-0.5, 5)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
ax.legend()
ax.set_title('线性相关\nu2 = 2×u1,完全冗余')
plt.tight_layout()
plt.show()
1.2 在 AI 中的意义
| 场景 | 线性无关的意义 |
|---|---|
| 特征工程 | 如果两个特征线性相关(如"温度(℃)"和"温度(℉)"),其中一个是冗余的 |
| PCA 降维 | 主成分之间互相正交(线性无关),每个主成分都提供独特信息 |
| 神经网络 | 如果权重矩阵的列线性相关,说明有些神经元是冗余的 |
1.3 用矩阵的秩判断
矩阵的秩(rank) = 矩阵中线性无关的行(或列)的最大数量。
# 3 列线性无关
A = np.array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
print(f"A 的秩: {np.linalg.matrix_rank(A)}") # 3(满秩)
# 第 3 列 = 第 1 列 + 第 2 列,冗余!
B = np.array([[1, 0, 1],
[0, 1, 1],
[0, 0, 0]])
print(f"B 的秩: {np.linalg.matrix_rank(B)}") # 2(不是满秩)
二、基与维度——描述空间的"坐标系"
2.1 基(Basis)
基 = 一组线性无关的向量,它们能"张成"整个空间(即任何向量都能用它们的组合表示)。
2.1.1 基最值得先记住的,不是术语,而是作用
你可以先把基理解成:
- 一套最小、够用、又不冗余的坐标系统
也就是说:
- 能表达所有目标
- 又没有多余方向
这正是后面很多 AI 方法为什么总在找“更好的表示基”的原因。
最常见的基是标准基:
# 二维空间的标准基
e1 = np.array([1, 0]) # x 方向
e2 = np.array([0, 1]) # y 方向
# 任何二维向量都可以用标准基表示
v = np.array([3, 5])
# v = 3 * e1 + 5 * e2
print(f"v = {v[0]} × e1 + {v[1]} × e2 = {v[0]*e1 + v[1]*e2}")
非标准基也可以:
# 换一组基
b1 = np.array([1, 1])
b2 = np.array([1, -1])
# v = [3, 5] 在新基下的坐标是?
# v = c1 * b1 + c2 * b2
# 解方程组
B = np.column_stack([b1, b2])
coords = np.linalg.solve(B, v)
print(f"在新基下的坐标: {coords}") # [4, -1]
# 验证: 4*[1,1] + (-1)*[1,-1] = [4,4]+[-1,1] = [3,5] ✓