1.5 正交性与投影
上一节我们建立了四大子空间的结构图景:行空间与零空间在
投影是线性代数中最具工程价值的工具:当方程
1.5.1 正交性的判定与正交补的重温
正交向量的严格定义
两个向量
由内积公式
零向量
正交向量组的线性无关性定理
定理:若非零向量组
证明:设
由于
这一定理的工程意义重大:正交向量组天然线性无关,无需再做无关性检验。这是标准正交基具有绝佳数值性质的根源。
正交补的严格定义
设
直观理解:
四大子空间的正交补关系
回到 1.4 节的四大子空间,它们之间存在以下正交配对(此处仅列举,不证明):
这意味着在
正交分解唯一性定理
定理:任意向量
其中
这一分解的几何图像:把
直和(Direct Sum)关系
正交分解可用直和记号表达:
直和
同理:
正交补的几何图像
四大子空间的正交关系刻画了线性变换
import numpy as np
A = np.array([[1, 2, 3],
[2, 4, 6], # 第二行 = 2 × 第一行
[1, 1, 1]])
# 验证 C(A^T) ⊥ N(A)
# 行空间基:RREF 非零行
# 零空间基:A x = 0 的解
from sympy import Matrix
M = Matrix(A)
rref, pivots = M.rref()
print(f"RREF:\n{rref}")
print(f"主元列: {pivots}") # (0, 2),rank = 2
# 零空间基(基础解系)
null_basis = M.nullspace()
print(f"\n零空间基: {null_basis}") # 通常给出 [-2, 1, 0] 之类的向量
# 取行空间基(RREF 的非零行)和零空间基,验证正交
row_basis = np.array([list(rref.row(i)) for i in range(len(pivots))], dtype=float)
print(f"\n行空间基:\n{row_basis}")
for nb in null_basis:
nb_vec = np.array(nb.tolist(), dtype=float).flatten()
for rb in row_basis:
dot = np.dot(rb, nb_vec)
print(f" <行基 {rb}, 零基 {nb_vec}> = {dot:.6f} (应≈0)")交互演示:正交判定与正交补关系的动态可视化见 1.5.2 节末尾
VectorProjectionDemo组件,可拖拽向量末端实时观察投影与正交关系。
1.5.2 向量到子空间的投影 —— 核心算法
投影的几何直觉
投影(Projection)是把高维空间中的向量垂直落影到低维子空间的过程。给定子空间
这一几何图像有两个核心要素:
落在 中: - 误差向量正交于
:
第 2 条是投影的核心条件:投影点使得误差向量
投影的最优性
投影点
证明思路:对任意
等号当且仅当
这一最小距离性质是投影在数据拟合、最小二乘等场景中起核心作用的根源。
一维投影:投影到直线
设直线方向为单位向量
投影系数(标量):
投影向量:
对非单位向量
误差向量(残差):
正交性验证:
误差向量确实与投影直线正交,这是投影算法的自动保证。
高维投影:投影到子空间
设子空间
要投影的向量
其中
正交条件:误差向量
展开得:
这就是著名的法方程(Normal Equations)。当
投影矩阵 P
将投影向量
投影矩阵的两大核心性质
性质 1:对称性
其中用到
性质 2:幂等性
幂等性的几何含义:投影的投影还是投影本身。一旦向量已经落在
投影矩阵的几何分解
任意向量
:投影到 的分量(可解释部分) :投影到 的分量(残差部分)
- 对称性:
- 幂等性:
投影矩阵的对偶性
import numpy as np
# 投影到由 a1, a2 张成的平面
A = np.array([[1, 0],
[0, 1],
[1, 1]], dtype=float) # 3x2,列满秩
b = np.array([1, 1, 2], dtype=float)
# 法方程:A^T A x = A^T b
ATA = A.T @ A
ATb = A.T @ b
x_hat = np.linalg.solve(ATA, ATb)
print(f"最佳坐标 x_hat = {x_hat}") # 例如 [0.5, 0.5]
p = A @ x_hat # 投影向量
e = b - p # 残差
print(f"投影 p = {p}")
print(f"残差 e = {e}")
print(f"<p, e> = {np.dot(p, e):.6f}") # 应为 0(正交)
# 投影矩阵
P = A @ np.linalg.inv(ATA) @ A.T
print(f"\n投影矩阵 P =\n{P}")
print(f"P 对称? {np.allclose(P, P.T)}") # True
print(f"P 幂等? {np.allclose(P @ P, P)}") # True
# 用 P 重新计算投影
p2 = P @ b
print(f"P @ b = {p2}") # 应等于 p1.5.3 最小二乘法 —— 投影的直接工程应用
最小二乘问题的代数描述
当方程
这就是最小二乘问题(Least Squares Problem)。它出现于过拟合数据、超定方程组、测量误差等几乎所有的实际工程场景。
最小二乘的几何本质
无解意味着
最小二乘的几何本质就是:用列空间中的投影向量
残差向量的几何位置
残差
残差位于左零空间。这一观察很重要:它告诉我们最小二乘的误差方向是
法方程在最小二乘中的核心地位
由
法方程是最小二乘问题的等价代数形式:原问题最小化
正规矩阵 的可逆性
定理:
必要性:若
充分性:若
最小二乘解的显式表达式
当
对应的投影矩阵(即把
这与 1.5.2 节导出的投影矩阵完全一致——最小二乘与投影是同一硬币的两面:代数上是最小化残差,几何上是投影到列空间。
拟合误差与勾股定理
由
故拟合误差的平方:
这一公式把误差大小转化为原向量与投影向量的范数平方差,计算简便。
统计视角的最小二乘
在统计学中,线性回归
- 回归系数
- 预测值
(投影到 的列空间) - 残差
(投影到左零空间) - 残差平方和(RSS)
回归的几何解释:最小二乘回归就是把观测向量
最小二乘的四大身份
同一个最小二乘问题,从不同视角有四种等价描述:(1) 代数视角——最小化
import numpy as np
# 直线拟合 y = β0 + β1 x(最小二乘)
x = np.array([1, 2, 3, 4, 5], dtype=float)
y = np.array([2.1, 3.9, 6.2, 8.1, 10.0], dtype=float)
# 构造设计矩阵 A = [[1, x1], [1, x2], ...]
A = np.vstack([np.ones_like(x), x]).T
print(f"A:\n{A}")
# 最小二乘解:x_hat = (A^T A)^-1 A^T y
ATA = A.T @ A
ATy = A.T @ y
beta = np.linalg.solve(ATA, ATy)
print(f"\n回归系数 β = {beta}") # [截距, 斜率]
# 预测与残差
y_hat = A @ beta # = P y
e = y - y_hat
print(f"预测值 ŷ = {y_hat}")
print(f"残差 e = {e}")
# 勾股定理验证
print(f"\n||y||^2 = {np.dot(y, y):.4f}")
print(f"||ŷ||^2 = {np.dot(y_hat, y_hat):.4f}")
print(f"||e||^2 = {np.dot(e, e):.4f}")
print(f"||ŷ||^2 + ||e||^2 = {np.dot(y_hat, y_hat) + np.dot(e, e):.4f} (应等于 ||y||^2)")
# 投影矩阵
P = A @ np.linalg.inv(ATA) @ A.T
print(f"\n投影矩阵 P 形状: {P.shape}")
print(f"P 幂等? {np.allclose(P @ P, P)}") # True
# 残差位于左零空间:A^T e ≈ 0
print(f"\nA^T e = {A.T @ e} (应≈0)")1.5.4 标准正交基 —— 数值稳定的黄金坐标系
标准正交的双重条件
一组向量
- 两两正交:
对所有 - 单位长度:
对所有
合并为一个简洁的内积条件:
其中
标准正交基的矩阵记号
将标准正交向量作为列构成矩阵
注意:
优势 1:坐标提取极其简单
任意向量
证明:设
对比一般基(需解
优势 2:投影公式退化
当子空间的基
无需计算矩阵逆!最小二乘解也简化为:
只是简单点积。
优势 3:保持向量长度不变
对任意
故
优势 4:数值稳定性极高
法方程
若
使用标准正交基
正交矩阵的定义
当
正交矩阵的几何意义:它代表纯旋转或反射变换,不改变向量长度和夹角。
正交矩阵的行列式性质
由
:纯旋转(保持定向) :旋转 + 反射(反转定向)
正交变换保持面积/体积不变,这是它在几何中的刚性特征。
标准正交基 = 数值黄金坐标系
把数据变换到标准正交基下,等价于把一个歪斜的坐标系校正为笛卡尔坐标系。在新的坐标系下,所有计算(投影、最小二乘、条件数)都变得简单且数值稳定。这是 PCA、SVD、QR 等方法在数据科学中必经标准正交化的原因。
import numpy as np
# 构造一组标准正交基(二维旋转矩阵)
theta = np.pi / 4 # 45°
Q = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
print(f"Q =\n{Q}")
print(f"Q^T Q =\n{Q.T @ Q}") # 应为单位阵
print(f"det(Q) = {np.linalg.det(Q):.6f}") # 1.0(纯旋转)
# 验证等距性
x = np.array([3, 4])
print(f"\n||x|| = {np.linalg.norm(x):.4f}")
print(f"||Qx|| = {np.linalg.norm(Q @ x):.4f}") # 应相等
# 用标准正交基做投影:P = Q Q^T
# 此处 Q 是方阵,P = I(整个空间都被覆盖)
# 改用一个"瘦"标准正交矩阵(3x2)
Q_slim = np.array([[1, 0],
[0, 1],
[0, 0]], dtype=float)
print(f"\nQ_slim^T Q_slim =\n{Q_slim.T @ Q_slim}") # I_2
P = Q_slim @ Q_slim.T
print(f"P =\n{P}") # 投影到 xy 平面
b = np.array([1, 2, 5], dtype=float)
p = P @ b
print(f"\nb = {b}, 投影 p = {p}") # [1, 2, 0]
print(f"无需计算逆,直接 Q Q^T b = {(Q_slim @ (Q_slim.T @ b))}")交互演示:标准正交基的逐步构建过程见 1.5.5 节末尾
GramSchmidtDemo组件,可分步观察从任意基到标准正交基的转化动画。
1.5.5 Gram-Schmidt 正交化过程 —— 从任意基到标准正交基的流水线
几何目标
给定一组线性无关的向量
关键不变量:对每一步
核心思想:逐次剥离已确定方向上的投影
Gram-Schmidt 的几何直觉清晰:从新向量中减去它在已有正交方向上的投影分量,剩下的部分就是与已有方向都垂直的新方向。
Step 1:归一化第一个向量
第一个向量无需正交化,只需归一化为单位长度。
Step 2:正交化第二个向量
从
此时
归一化:
Step k:通用公式
对第
归一化:
几何可视化
每一步生成的
经典 Gram-Schmidt 与改进 Gram-Schmidt
经典 Gram-Schmidt(CGS):直接按上述公式计算。但 CGS 在数值上不稳定——当
改进 Gram-Schmidt(MGS):调整计算顺序,每计算一个投影分量就立即从
实际计算中应优先使用 MGS 或 Householder QR,CGS 主要用于教学演示。
中间产物:三角系数
Gram-Schmidt 过程中产生的内积系数有重要意义:
特别地:
(第 步正交化向量的长度) ( 在 上的投影系数)
整理公式
Gram-Schmidt 的流水线视角
Gram-Schmidt 像一条加工流水线:原料是任意线性无关的向量组
import numpy as np
def gram_schmidt(A):
"""经典 Gram-Schmidt 正交化
输入: A (m x n) 列满秩矩阵
输出: Q (m x n) 标准正交, R (n x n) 上三角
"""
m, n = A.shape
Q = np.zeros((m, n))
R = np.zeros((n, n))
for k in range(n):
v = A[:, k].copy()
for i in range(k):
R[i, k] = Q[:, i] @ A[:, k] # r_ik = a_k · q_i
v -= R[i, k] * Q[:, i] # 减去已有方向的投影
R[k, k] = np.linalg.norm(v) # r_kk = ||v_k||
if R[k, k] < 1e-12:
raise ValueError("列向量线性相关,无法正交化")
Q[:, k] = v / R[k, k]
return Q, R
# 测试
A = np.array([[1, 1, 1],
[0, 1, 1],
[0, 0, 1]], dtype=float)
Q, R = gram_schmidt(A)
print(f"Q =\n{Q}")
print(f"R =\n{R}")
print(f"Q^T Q =\n{Q.T @ Q}") # 应为单位阵
print(f"Q R =\n{Q @ R}") # 应等于 A
print(f"QR == A? {np.allclose(Q @ R, A)}")
# 与 numpy 内置 QR 对比(使用 Householder,更稳定)
Q_np, R_np = np.linalg.qr(A)
print(f"\nnumpy QR:")
print(f"Q =\n{Q_np}")
print(f"R =\n{R_np}")1.5.6 QR 分解 —— Gram-Schmidt 的矩阵形式
QR 分解的定义
任意列满秩矩阵
其中:
:列向量标准正交,即 :上三角矩阵(Upper Triangular),对角线元素为正
R 矩阵的几何意义
由 Gram-Schmidt 的中间产物可知:
- 对角线元素
:第 步正交化向量的长度 - 非对角线元素
( ): 在 上的投影系数
由于
QR 分解的几何解读
任意线性变换
:正交变换(旋转或反射),保持长度和角度 :上三角变换,包含伸缩和剪切
即先用
嵌套子空间性质
由 Gram-Schmidt 的不变量:
即
用 QR 分解求解最小二乘
当
代入
由
由于
QR 分解的数值优势
法方程
QR 分解方法:直接处理
结论:QR 分解比法方程数值稳定性高一个数量级,是工程实现最小二乘的首选方法(如 NumPy 的 np.linalg.lstsq 内部就用 QR 或 SVD)。
经济型 QR 与完整 QR
当
- 经济型 QR(瘦 QR):
是 , 是 。仅包含张成 所需的 个正交向量。 - 完整 QR(胖 QR):
是 正交矩阵, 是 (下部全零)。补充 个正交向量把 补全为方阵。
最小二乘求解只需经济型 QR。
QR 分解与行列式
由
(
几何含义:正交变换不改变体积,故
QR 分解 = 正交化 + 上三角化
QR 分解把任意矩阵
import numpy as np
# 用 QR 分解求解最小二乘
# 问题:拟合 y = β0 + β1 x + β2 x^2(二次多项式)
x = np.array([0, 1, 2, 3, 4, 5], dtype=float)
y = np.array([1.1, 2.9, 6.2, 11.0, 17.9, 26.1], dtype=float)
# 设计矩阵
A = np.vstack([np.ones_like(x), x, x**2]).T # 6x3
print(f"A shape: {A.shape}")
# 法方程方法(条件数平方)
beta_normal = np.linalg.solve(A.T @ A, A.T @ y)
print(f"\n[法方程] β = {beta_normal}")
# QR 方法(条件数不变)
Q, R = np.linalg.qr(A) # 经济型 QR
print(f"\nQ shape: {Q.shape}, R shape: {R.shape}")
print(f"Q^T Q =\n{Q.T @ Q}") # 应为 I_3
# 解 R x = Q^T b(上三角回代)
QTb = Q.T @ y
beta_qr = np.linalg.solve(R, QTb) # 上三角求解
print(f"[QR] β = {beta_qr}")
# 两种方法结果应一致
print(f"\n两者一致? {np.allclose(beta_normal, beta_qr)}")
# 用行列式公式估计 |det(A^T A)|
# 注意 A 是 6x3 不可逆,但 A^T A 可逆
det_ATA_normal = np.linalg.det(A.T @ A)
det_R_squared = np.prod(np.diag(R))**2 # |det(A^T A)| = |det(R)|^2
print(f"\n|det(A^T A)| (直接) = {det_ATA_normal:.6f}")
print(f"|det(R)|^2 = {det_R_squared:.6f}")
# 预测
y_hat = A @ beta_qr
print(f"\n预测 ŷ = {y_hat}")
print(f"残差 e = {y - y_hat}")
print(f"R^2 = {1 - np.sum((y - y_hat)**2) / np.sum((y - y.mean())**2):.4f}")1.5.7 综合几何图景 —— 正交性在整个线性代数中的枢纽地位
四大经典正交关系总结
回顾本节与上一节的所有正交关系,可用投影视角统一解读:
1. 行空间
任意
2. 列空间
任意
投影矩阵 与 的联合作用
把
:投影到 ,提取模型能解释的信号 :投影到 ,提取模型无法解释的噪声
这对投影矩阵共同作用,把空间完全分解为两个正交部分。这一分解是信号处理、统计回归、机器学习的共同数学基础。
从求解方程到最佳逼近的思维转换
| 场景 | 数学问题 | 几何图像 |
|---|---|---|
| 直接命中 | ||
| 投影最近似 |
当
勾股定理在子空间中的推广
由
这一公式将平面几何中的勾股定理推广到任意维度的子空间。它把原信号的能量分解为模型解释的能量和残差能量两部分——这是统计中方差分解的几何根源。
在回归分析中:
:总平方和(TSS) :回归平方和(ESS) :残差平方和(RSS) - 决定系数
正交性在人工智能中的核心体现
正交性是现代 AI 算法的隐形骨架:
PCA(主成分分析):寻找数据协方差矩阵的特征向量,这些特征向量两两正交。正交性保证了主成分之间不冗余,每个主成分携带独立信息。
神经网络中的正交正则化:通过约束权重矩阵接近正交矩阵,避免梯度消失或爆炸,提升训练稳定性。正交初始化(如 SVD 初始化)是深度网络训练的关键技巧。
Transformer 中的自注意力正交性:多头注意力的不同头通过正交化减少冗余,让每个头关注不同子空间的信息。位置编码的正交性保证不同位置的编码可区分。
正交 Procrustes 问题:在词向量对齐、神经网络权重匹配等场景,求解
( 正交)使目标最优,本质是 SVD 在正交约束下的应用。 数值算法的稳定基石:从共轭梯度法到 Krylov 子空间方法,正交性是迭代算法收敛与稳定的核心保障。
正交性 = 线性代数的枢纽
本节的主线正交 → 投影 → 最小二乘 → 标准正交基 → Gram-Schmidt → QR展示了正交性如何从抽象的几何概念逐步转化为可计算的代数工具。每一站都对应一种工程应用:投影对应数据拟合,最小二乘对应回归分析,QR 对应数值稳定算法。下一节将进入特征值与特征向量——把正交扩展到特征向量正交(对称矩阵的可对角化性),最终通向 SVD 这一线性代数的综合结论。
import numpy as np
# 综合演示:用 QR 分解做 PCA(简化版)
# 数据:100 个样本,每个 3 维
np.random.seed(42)
mean = [0, 0, 0]
cov = [[2, 1, 0.5],
[1, 2, 0.3],
[0.5, 0.3, 1]]
X = np.random.multivariate_normal(mean, cov, 100)
print(f"数据形状: {X.shape}")
# 中心化
X_centered = X - X.mean(axis=0)
# 协方差矩阵
C = (X_centered.T @ X_centered) / (X.shape[0] - 1)
print(f"\n协方差矩阵:\n{C}")
# 用 QR 分解计算正交基(注意:PCA 通常用 SVD,这里仅演示)
Q, R = np.linalg.qr(X_centered)
print(f"\nQR 分解后 Q 的列(正交方向):")
print(Q[:5, :]) # 前 5 行预览
# 验证 Q 的列正交
print(f"\nQ^T Q =\n{Q.T @ Q}") # 应为 I
# 对比:SVD 的正交基
U, S, Vt = np.linalg.svd(X_centered, full_matrices=False)
print(f"\nSVD 的奇异值: {S}")
print(f"主成分方向(V 的列):\n{Vt.T}")
# 计算各主成分解释的方差比例
variance_ratio = S**2 / np.sum(S**2)
print(f"\n各主成分方差占比: {variance_ratio}")
print(f"累计方差: {np.cumsum(variance_ratio)}")
# 验证:正交变换保持总能量
total_energy = np.sum(X_centered**2)
projected_energy = np.sum(S**2)
print(f"\n原数据总能量: {total_energy:.4f}")
print(f"主成分总能量: {projected_energy:.4f}") # 应相等交互演示回顾:本节为综合总结章节,可回顾本章 4 个交互组件——
VectorProjectionDemo(1.5.2,投影与正交性)、LeastSquaresDemo(1.5.3,最小二乘平面拟合)、GramSchmidtDemo(1.5.5,Gram-Schmidt 分步动画)、QRDecompositionDemo(1.5.6,QR 分解双场景对比),从不同视角理解正交性在线性代数中的枢纽地位。
本章小结
本节完成了从四大子空间结构到投影与最小二乘算法的完整闭环,并铺设了通往 SVD 的最后一块基石:
正交性是几何核心:四大子空间的正交配对(行⊥零、列⊥左零)让任意向量可唯一正交分解,这是投影算法的几何基础。
投影是核心算法:一维投影、高维投影、法方程
、投影矩阵 的对称性与幂等性,构成了数据拟合的数学骨架。 最小二乘是直接应用:当
无解时,投影给出最佳逼近 ,残差位于左零空间。统计视角下即线性回归。 标准正交基是黄金坐标系:
让坐标提取、投影、最小二乘都退化为简单点积,且保持长度、数值稳定。 Gram-Schmidt 是构造流水线:从任意基到标准正交基的逐步正交化,副产物为上三角系数
。 QR 分解是矩阵形式:
让最小二乘变为回代求解 ,避免 的条件数平方放大,是工程首选。 正交性是 AI 的隐形骨架:PCA、神经网络正则化、Transformer 注意力等核心算法都根植于正交性。
下一节将进入特征值与特征向量:把正交从基的层面扩展到变换的层面,研究哪些方向在变换下不变方向只伸缩。最终,对称矩阵的特征向量正交将把本节的标准正交基与变换的特征结构统一起来,通向 SVD(奇异值分解)——线性代数的综合结论。
练习题
第 1 题 概念推导
设
参考答案
对称性:
幂等性:
第 2 题 代码验证
利用本节的 <GramSchmidtDemo> 交互组件,输入向量组
参考答案
第 1 步:
第 2 步:
第 3 步:
验证正交性:
第 3 题 概念推导
设
参考答案
计算
投影向量
残差
验证正交性:
常见错误
错误 1 · 把正交矩阵与可逆矩阵混为一谈
原因:正交矩阵
解决:明确正交矩阵 = 可逆 + 逆等于转置这一双重条件。判定时检查
错误 2 · 投影矩阵误用为非对称或非幂等
原因:投影矩阵
解决:牢记投影矩阵的完整形式
错误 3 · Gram-Schmidt 正交化时减去投影的顺序错误
原因:第
解决:严格按公式
错误 4 · 最小二乘法方程忽视条件数平方放大
原因:法方程 np.linalg.solve(A.T @ A, A.T @ b) 在病态情形下可能给出错误结果。
解决:工程实现最小二乘时优先使用 QR 分解(解 np.linalg.lstsq 内部默认使用 SVD 或 QR,比手动实现法方程稳定得多。仅在