特征值、SVD 与最小二乘项目
本节目标
先用特征值和 SVD 建立“矩阵沿哪些方向缩放”的直觉,再完成一个不依赖第三方库、带输入契约和测试的最小二乘项目。重点是能解释方向、秩、残差和数值边界,而不是把分解函数当成黑箱。
特征向量:变换后方向不变
非零 若满足:
则 是特征向量、 是特征值。变换只沿该方向缩放或翻转。例:对角矩阵 diag(3, 0.5) 的坐标轴方向是特征向量。
用途:分析迭代系统的增长/衰减、协方差矩阵的主方向、某些优化问题的曲率。不是所有矩阵都有足够实特征向量,不能把特征分解当万能工具。
特征值只对方阵定义;同一个线性变换换基后矩阵写法会变,但特征值保持。对称实矩阵有一组正交实特征向量,这是协方差矩阵和 PCA 特别方便的原因。一般实矩阵可能有复特征值,也可能不可对角化。
SVD:任意矩阵的方向分解
的列是正交方向, 的非负奇异值表示各方向缩放强度。SVD 适用于非方阵;非零奇异值数量等于秩。
若 为 ,完整 SVD 的具体 shape 取决于 full/reduced 约定;工程上必须查库文档。右奇异向量位于输入空间,左奇异向量位于输出空间,不能只看到“方向”二字就互换。
保留前 个最大奇异值可得低秩近似:
它可用于压缩、去噪和 PCA 的计算基础。选择 是信息保留与成本的权衡;低方差方向也可能承载稀有但关键的安全信号。
按 Frobenius 范数或 2-范数,截断 SVD 给出给定秩 的最佳低秩近似;“最佳”只针对该数学误差,不保证下游正确率、安全性或语义可解释性最佳。
在 ML/Embedding 中的用途
- PCA 寻找数据方差最大的正交方向,需先中心化;主成分不等于因果因素或“最有业务价值”。
- 权重矩阵低秩近似可减少参数和计算,但要实际评测任务损失。
- 检索向量降维可省内存并加速,但会改变近邻排序。
- 小奇异值意味着某些方向接近不可辨识,求解可能对噪声敏感。
项目:从零拟合线性模型
实现:least_squares.py|测试:test_least_squares.py。
输入与输出契约
xs、ys是等长序列,至少两个观测;- 每个值必须是有限实数,布尔值、字符串、
NaN和无穷值被拒绝; x必须至少有两个不同值,否则斜率不可识别;- 输出
LineFit记录样本量、斜率、截距、MSE 和两条残差正交诊断; - 本项目只拟合含截距的一元普通最小二乘,不声称因果或线上泛化。
实现先中心化 ,用 math.fsum 与 statistics.fmean 计算闭式解,再验证:
运行与测试
从 vault 根目录运行:
$env:PYTHONDONTWRITEBYTECODE = '1'
python -B '.\Knowledge\AI Agent Engineer\docs\线性代数\examples\least_squares.py'
python -B -m unittest discover `
-s '.\Knowledge\AI Agent Engineer\docs\线性代数\examples' `
-p 'test_*.py' `
-v脚本预期输出:
observations=5
weight=1.990000 bias=0.090000 mse=0.010200
residual-sum=-0.000000000000
centered-x-dot-residuals=0.000000000000浮点零可能显示为 -0.000...;这不是负误差,只是舍入后的符号位。判断正交使用容差,不要求文本必须写成正零。
8 项测试覆盖:精确直线、两点直线、带噪样例与残差正交、行顺序不变性、大坐标偏移、常量 、长度边界,以及非有限/非数值/布尔输入。
2026-07-14 实际验证
在 Python 3.11.9 下,脚本以普通模式和
python -O模式运行结果一致;8 项unittest全部通过,两个 Python 文件也通过py_compile语法检查。验证生成的__pycache__已删除,未作为知识库内容保留。
NumPy 扩展层
本机未安装 NumPy,因此核心项目只用标准库并已实际运行。以后进入科学计算环境,可用官方
numpy.linalg.lstsq对照结果;它还返回秩与奇异值,并在多解时返回最小 2-范数解。使用前记录 NumPy 版本和rcond,不要只复制一行调用。
必做扩展
- 把所有 改成相同值,观察脚本拒绝拟合;用秩解释。
- 加入一个极端离群点,比较参数和 MSE。
- 手算小数据,验证代码不是“黑箱”。
- 将全部 加上 ,观察中心化实现如何工作;再解释截距为何会改变。
- 构造两个几乎相同的特征列,联系 数值稳定性与条件数。
- 若以后用 NumPy,比较
linalg.lstsq,不要显式求逆,并记录库版本、rcond、rank 和奇异值。
常见错误与排查
- 用
assert承担生产输入检查;python -O会移除 assert。本项目使用显式异常和退出状态。 - 只看 MSE,不检查残差、数据图、离群点和验证集。
- 把所有 相同导致的不可识别误称为“样本太少”;即使复制更多相同 ,秩仍不增加。
- 把数值上能返回结果当作参数稳定;近常量 仍可能非常敏感。
- 用显式逆实现最小二乘,却不检查秩、条件数和求解器契约。
掌握检查
- 能解释特征向量与奇异向量不是同一概念。
- 能用奇异值说明秩与近奇异。
- 能解释 PCA 保留高方差而非保证任务最优。
- 项目普通模式与
-O模式输出一致,8 项测试通过。 - 我能解释输入契约、中心化公式和残差为何正交。
- 我能区分代数最优、数值稳定和统计泛化。
参考资料
核验日期:2026-07-14。
- MIT OpenCourseWare:18.06SC Linear Algebra
- MIT 18.06SC:Least Squares, Determinants and Eigenvalues
- NumPy:
linalg.svd - NumPy:
linalg.lstsq
返回 线性代数。