尧图精选

特征值与特征向量:几何意义、手算、NumPy与PCA降维

🕒 发布时间:2026/10/1 21:30:34 📁 来源:尧图网络
线性代数里有两个概念考试爱考、工程里天天用、面试还总被追问那就是特征向量和特征值。我第一次真正把它们想明白不是在课堂上而是在写PCA降维代码时发现协方差矩阵分解出来的东西对不上号回头翻书才把几何意义补上。这两个词看着抽象本质却很朴素一个矩阵作用在向量上大多数方向都会被拧歪只有少数几个特殊方向只被拉伸或压缩方向不变这些方向就是特征向量拉伸的倍数就是特征值。搞懂它你能看懂主成分分析、振动模态、马尔可夫链稳态、稳定性判据甚至能明白为什么有人把AI特征值这种说法挂在嘴边。这篇内容适合正在学线性代数的学生、需要复现算法的工程师以及早就学过但一直没真正用起来的从业者。1. 特征值与特征向量到底在解决什么问题1.1 先把矩阵当成一台方向改造机很多人卡在特征值是因为一上来就盯着det(A - λI) 0这个公式背完全不知道它在干嘛。换个角度把一个 n 阶矩阵 A 想象成一台机器你往里面丢一个向量 v它吐出来一个新向量 Av。绝大多数情况下吐出来的向量和原来的方向不一样长度也变了相当于被拧了一下。但总有那么几个倒霉又幸运的方向丢进去之后只被拉长或压短方向纹丝不动。这种输入方向就是特征向量拉长的倍数就是特征值。所以方程Av λv说的是一件很具体的事A 作用在 v 上效果等价于用一个标量 λ 去缩放 v。这个视角一换很多结论就顺了。比如特征值 λ 1说明这个方向被完全保留λ 0说明这个方向被压没了矩阵不可逆λ 是负数说明方向反过来了。你先建立这个直觉再去算行列式心态会完全不一样。我常跟人打比方矩阵 A 像是一个雕塑家大多数石头向量被他敲得面目全非但有那么几根纹理特征向量他只顺着一敲长度变了但走向没变。找特征值本质上就是在找这个矩阵的纹理方向。1.2 几何直觉单位圆为什么会被压成椭圆拿一个对称矩阵举例比如 A [[3, 1], [1, 3]]。你把平面上所有单位长度的向量都丢进 A输出的向量末端会画出一个椭圆。这个椭圆的长轴和短轴方向正好就是 A 的两个特征向量方向长轴长度和短轴长度就是两个特征值。这不是巧合。因为任何向量都可以拆成两个特征向量方向的叠加A 作用上去之后只是把两个分量分别乘上各自的 λ 再拼回来。哪个方向 λ 大那个方向就被拉得最狠椭圆就往那个方向鼓出去。这也是为什么在数据处理里特征值大的方向代表信息量大——数据在那个方向上被放大得最多方差最大。提示只有实对称矩阵的椭圆长短轴一定正交一般矩阵没有这么美好的性质特征向量之间可能不正交甚至特征值是复数。别把对称矩阵的结论当成通用结论用。再看旋转矩阵比如逆时针转90度的 [[0, -1], [1, 0]]。你把任何非零向量丢进去方向都会转90度根本不存在方向不变的实向量所以它没有实特征值特征值是 ±i。这个例子特别值钱它告诉你特征值可以是复数而复数特征值往往对应旋转或振荡这种行为在振动分析、控制系统里天天出现。1.3 定义落地Av λv 里每个符号的真实含义正式写法是如果存在非零向量 v 和标量 λ使得Av λv那么 λ 叫 A 的特征值v 叫对应的特征向量。这里有个绝对不能漏的条件v 必须非零向量。如果允许零向量那任何 λ 都是特征值定义就废了。把等式移项得到(A - λI)v 0。这是一个齐次线性方程组它要有非零解系数矩阵 A - λI 必须奇异也就是行列式为零det(A - λI) 0。这个关于 λ 的多项式叫特征多项式n 阶矩阵会得到 n 次多项式理论上最多有 n 个特征值含重数在复数范围内恰好 n 个。几个必须刻进脑子的事实特征值之和等于矩阵的迹主对角线元素之和这是免费的验算工具。特征值之积等于矩阵的行列式同样免费。特征向量只确定方向不唯一。v 是特征向量2v 也是通常归一化成单位向量方便比较。一个特征值对应的所有特征向量再加上零向量构成一个子空间叫特征空间。验算这两条性质能帮你省下大量检查时间。手算完一组特征值先加一遍看是否等于迹再乘一遍看是否等于行列式两个都对基本就不会错得离谱。2. 手算的完整流程与容易踩的坑2.1 三步走特征方程、特征值、特征向量手算特征值特征向量我总结成固定三步照着走不会乱写出A - λI把 λ 从主对角线上减下去。计算det(A - λI)得到关于 λ 的多项式解方程求出所有 λ。对每一个 λ把它代回(A - λI)v 0解这个齐次方程组求零空间的一组基就是对应的特征向量。第二步是运算量最大的地方。2 阶直接对角线相乘再减副对角线3 阶可以按某一行展开或者用沙路法则。这里强烈建议先算迹和行列式因为 2 阶的特征方程可以直接写成λ² - (迹)λ (行列式) 0比展开行列式快得多也不容易符号出错。第三步很多人会卡住。其实(A - λI)v 0求的就是矩阵 A - λI 的零空间直接对它做行化简找自由变量回代得到基向量即可。特征向量的意义是方向所以最后归一化与否都不影响正确性。2.2 一个 2x2 的完整手算演示拿 A [[4, 1], [2, 3]] 练手。先算迹 trace 4 3 7行列式 det 4×3 - 1×2 10。特征方程直接写λ² - 7λ 10 0因式分解 (λ - 5)(λ - 2) 0得到 λ₁ 5λ₂ 2。验算5 2 7 等于迹5 × 2 10 等于行列式通过。求 λ 5 对应的特征向量A - 5I [[-1, 1], [2, -2]]。两行成比例化简后等价于 -v₁ v₂ 0也就是 v₁ v₂。取 v (1, 1)。求 λ 2 对应的特征向量A - 2I [[2, 1], [2, 1]]等价于 2v₁ v₂ 0即 v₂ -2v₁。取 v (1, -2)。验证一下第一个A(1,1) (41, 23) (5, 5) 5×(1,1)对上了。第二个A(1,-2) (4-2, 2-6) (2, -4) 2×(1,-2)也对上了。整个过程就是解方程 验算没有任何玄学。2.3 3x3 与重根、复根的处理3 阶矩阵手算量明显上来但套路一样。如果矩阵是上三角或下三角特征值就是对角线元素直接读出来这能省你十分钟。比如 [[2, 1, 7], [0, 3, 5], [0, 0, -1]]特征值就是 2、3、-1不需要算行列式。重根的情况要特别小心。比如 A [[2, 1], [0, 2]]特征多项式是 (λ - 2)²λ 2 是二重根。但你去求特征向量会发现A - 2I [[0, 1], [0, 0]]零空间只有一维只能找到一个线性无关的特征向量 (1, 0)。这叫缺陷矩阵几何重数1小于代数重数2它不能被对角化。这是个关键区别有重根不代表一定能对角化。复特征值的典型代表是旋转矩阵。A [[0, -1], [1, 0]]特征方程 λ² 1 0λ ±i。它没有实特征向量因为平面上没有任何方向在转90度后保持方向不变。复特征值在工程里对应振荡模态实部决定衰减还是发散虚部对应振荡频率。注意遇到重根先别急着写两个特征向量。老老实实解零空间看看维数到底是多少。几何重数永远小于等于代数重数两者不等就是不可对角化的信号。2.4 手算阶段的常见坑与验算套路我把新手最容易翻车的地方列一下坑表现形式正确做法忘记 v ≠ 0把零向量当特征向量定义明确要求非零零向量永远不算行列式符号错2 阶副对角线忘减2 阶用 ad - bc别记反重根漏解二重根只找一个特征向量一律解零空间数维数特征向量不归一化就对比和别人答案对不上方向一致即可长度无意义不复核算完就交卷用迹和行列式双向验算再补一个实用技巧如果你只想知道特征值、不关心特征向量就用迹和行列式凑 2 阶方程、用迹加二阶主子式加行列式凑 3 阶方程速度比展开行列式快很多。3 阶的特征方程是λ³ - (迹)λ² (所有二阶主子式之和)λ - (行列式) 0这个公式考场上能救命。3. 用代码把特征分解真正跑起来3.1 NumPy 基础用法与返回值确认手算练直觉工程上没人真去手算都是调库。Python 里最常用的是 NumPyimport numpy as np A np.array([[4.0, 1.0], [2.0, 3.0]]) w, v np.linalg.eig(A) print(特征值:, w) print(特征向量矩阵(列向量):\n, v) # 验证 A v λ v for i in range(len(w)): lam w[i] vec v[:, i] print(残差:, np.allclose(A vec, lam * vec))这里有个新手百分百会踩的坑np.linalg.eig返回的v每一列才是一个特征向量不是每一行。v[:, i]对应w[i]。我第一次用的时候按行取结果残差全不对debug 了半小时。另外注意w的返回类型。对非对称矩阵特征值可能是复数w就是复数数组。如果你明确知道矩阵是实对称的直接改用np.linalg.eigh它更快、数值更稳返回的特征值一定是实数并按升序排列特征向量矩阵一定正交。选错函数不是不能用而是会损失对称性带来的精度优势。3.2 对称矩阵的正交对角化验证对称矩阵有个非常好的性质一定能正交对角化写成A Q Λ QᵀQ 的列是标准正交特征向量。这个性质是 PCA 的数学地基值得亲手验一遍。import numpy as np A np.array([[3.0, 1.0], [1.0, 3.0]]) w, Q np.linalg.eigh(A) print(特征值:, w) # 升序 [2. 4.] print(Q:\n, Q) # 正交性验证 print(Q^T Q 是否为单位阵:, np.allclose(Q.T Q, np.eye(2))) # 重构 A Lambda np.diag(w) A_rec Q Lambda Q.T print(重构是否一致:, np.allclose(A_rec, A))跑完你会发现 λ 2 和 4特征向量分别沿 (1, -1) 和 (1, 1) 方向正好相互垂直。这个正交不是巧合是实对称矩阵的定理保证。重构那一步Q Λ Qᵀ就是特征分解的字面翻译记住这个形式理解 SVD、PCA、谱聚类都会轻松很多。3.3 手写幂迭代为什么工程里不总是直接调库真实工程里的矩阵常常是几十万阶的稀疏矩阵直接做完整特征分解时间复杂度和内存都吃不消。这时候如果只需要模最大的那个特征值叫主特征值可以用幂迭代简单到离谱还特别有效。import numpy as np def power_iteration(A, num_iter1000, tol1e-10): n A.shape[0] x np.random.rand(n) x x / np.linalg.norm(x) lam_old 0.0 for _ in range(num_iter): y A x x y / np.linalg.norm(y) lam x (A x) # Rayleigh 商 if abs(lam - lam_old) tol: break lam_old lam return lam, x A np.array([[4.0, 1.0], [2.0, 3.0]]) lam, vec power_iteration(A) print(主特征值:, lam) print(主特征向量:, vec)原理很直白任意向量拆成特征向量的线性组合每乘一次 A大的特征值那个分量被放大得更多迭代足够多次之后小分量被稀释掉剩下的方向就是主特征向量。收敛速度取决于最大特征值和次大特征值的比值比值越接近1收敛越慢。提示幂迭代拿到的是模最大的特征值如果最大特征值是负数会反复变号但 Rayleigh 商能自动处理符号。想要其他特征值可以用位移法或者反幂法思路是在 A - σI 上做迭代把想要求的特征值搬到主位置。4. 工程与数据场景里的真实用法4.1 PCA 降维本质就是协方差矩阵的特征分解主成分分析PCA是特征分解最广为人知的应用。流程拆开看其实很清楚把数据矩阵按列中心化每列减去均值。计算协方差矩阵C Xᵀ X / (n - 1)。对 C 做特征分解得到特征值和特征向量。按特征值从大到小排序取前 k 个特征向量组成投影矩阵。用原始数据乘投影矩阵得到降维后的数据。为什么是特征值大的方向因为数据投影到某个方向后的方差正好等于该方向对应的特征值。特征值大说明这个方向的数据分散得开携带的信息多。把特征值小的方向丢掉相当于丢掉噪声和不重要的波动这就是降维的本质。import numpy as np X np.random.randn(100, 5) X_centered X - X.mean(axis0) C X_centered.T X_centered / (len(X) - 1) w, v np.linalg.eigh(C) idx np.argsort(w)[::-1] w_sorted w[idx] v_sorted v[:, idx] print(各主成分方差:, w_sorted) print(解释方差比:, w_sorted / w_sorted.sum()) k 2 X_pca X_centered v_sorted[:, :k] print(降维后形状:, X_pca.shape)实际做的时候有两个细节要提醒。第一一定要中心化不中心化协方差矩阵的定义就不对。第二如果各特征量纲差得多先做标准化否则量纲大的特征会独占主成分方向结论会失真。这两个点在真实项目里踩坑率极高网上很多教程直接省略照着抄会出问题。4.2 振动模态、稳定性分析与微分方程机械振动里一个多自由度系统的无阻尼自由振动方程是M x K x 0其中 M 是质量矩阵K 是刚度矩阵。假设解形如x v e^(jωt)代进去化简问题就变成广义特征值问题K v ω² M v。特征值 ω² 就是固有频率的平方特征向量 v 就是振型模态。这个应用的价值在于结构共振会出大事工程师必须在设计阶段就知道固有频率避开激励频率。而解固有频率的过程就是解一个特征值问题。反过来如果只想知道系统稳不稳看状态方程x A x里 A 的特征值所有特征值实部都小于零系统稳定只要有一个实部大于零就会发散。复特征值在这里特别重要。实部对应衰减或增长的快慢虚部对应振荡频率。一个二阶系统特征值是 -1 ± 3i说明它振荡频率由虚部决定振幅按 e^(-t) 衰减。这套判据在控制工程里是基本功理解到位之后画根轨迹、判稳定性都不再靠死记。4.3 马尔可夫链稳态分布与 PageRank马尔可夫链有个漂亮的性质如果转移矩阵 P 满足一定条件它的幂会收敛到一个稳态稳态分布就是 P 的特征值 1 对应的特征向量。因为稳态满足π P π或者写成列向量形式Pᵀ π π这不就是特征值的定义吗注意这里是左特征向量行向量或者右乘转移矩阵的转置和前面Av λv的写法差一个转置很多人在这里犯迷糊。判断方法很简单看方程里特征向量乘在矩阵的哪一边。PageRank 就是把这个思路工程化的典型。它构造一个带阻尼的转移矩阵然后不停地做π ← π G迭代本质就是幂迭代求主特征向量。用幂迭代的原因也很实际网页图动不动上亿节点完整特征分解根本做不动而每次迭代只需要做一次稀疏矩阵向量乘法内存和时间都扛得住。5. 常见问题排查与实操速查5.1 那些年被问烂的疑问问题一特征向量为什么可以有无数个因为特征向量的核心是方向不是具体长度。Av λv两边同时乘任何非零常数仍然成立。所以求出来之后通常归一化方便在不同实现之间对齐但归一化方式不唯一欧氏范数、最大分量置一等都有人用对比结果时只看方向是否一致。问题二eig和eigh到底怎么选函数适用矩阵返回特征值特点np.linalg.eig任意方阵可能复数通用慢一些np.linalg.eigh实对称/复厄米必为实数升序快、稳、正交np.linalg.eigvals任意方阵只返回特征值不需要特征向量时用如果你的矩阵在数学上对称但因为有浮点误差看起来不完全对称可以先做A (A A.T) / 2强制对称再调eigh结果会稳定很多。这个技巧在协方差矩阵场景里非常实用。问题三特征值分解和 SVD 有什么区别特征分解要求方阵而且矩阵不一定能对角化SVD 对任意形状矩阵都成立永远存在。对实对称半正定矩阵SVD 和特征分解本质是一回事。PCA 里既可以用特征分解协方差矩阵也可以直接对数据矩阵做 SVD后者数值上更稳实践中我更推荐 SVD 路线。问题四网上说的AI特征值是这个特征值吗不是一回事。你搜如何降低AI特征值这类词它指的是内容检测里借用的一类统计打分或特征向量和线性代数里Av λv定义的数学特征值没有直接关系。名字撞车而已。真要学线性代数认准数学定义别被这些借词带偏。5.2 速查表与避坑清单现象可能原因排查方向残差Av - λv不为零特征向量按行取了改成v[:, i]结果和别人对不上特征向量未归一化比较方向忽略长度特征值突然出现复数矩阵非对称且存在旋转成分属正常检查是否有实特征值需求特征值数量少于阶数计算精度导致重根合并降低容差或改用解析方法验证大矩阵eig卡死稠密分解复杂度太高改用幂迭代或稀疏求解器PCA 结果异常忘记中心化或标准化逐列减均值量纲差异大时标准化最后分享两个我反复用到的小技巧。第一拿到任何一组特征值先算迹和行列式验算一分钟能挡掉大部分低级错误。第二判断矩阵能不能对角化数一下每个特征值的几何重数零空间维数只要有一个小于代数重数就别指望Q Λ Q⁻¹能还原原矩阵工程上这类缺陷矩阵往往对应耦合极强的系统需要格外小心。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →