numpy.linalg.inv()报“Singular matrix”错因矩阵行列式为0不可逆,常见于未中心化、特征共线或秩亏;eig()返回复特征值正常,仅实对称矩阵保证全实数,应优先用eigh()提升精度与速度。

直接用 numpy.linalg.inv() 和 numpy.linalg.eig(),但必须确保矩阵可逆且是方阵;否则会报错或返回无意义结果。
为什么 numpy.linalg.inv() 有时报 LinAlgError: Singular matrix
这个错误说明输入矩阵行列式为 0,不可逆。常见于:数据未中心化、特征高度共线性、人为构造的秩亏矩阵(比如两行完全相同)。
- 检查是否方阵:
A.shape[0] == A.shape[1],不是就别调inv() - 快速判断是否接近奇异:
np.linalg.cond(A),若远大于1e15,数值上已不稳定 - 替代方案:用
np.linalg.pinv()(Moore-Penrose 伪逆),它对非满秩矩阵也返回结果,但注意这不是严格意义上的逆
numpy.linalg.eig() 返回的特征值是复数?正常吗
正常。只要矩阵不是实对称(或厄米)矩阵,特征值就可能是复数。例如随机生成的 np.random.rand(3,3) 几乎必出复数特征值。
- 实对称矩阵才保证全实特征值:可用
np.allclose(A, A.T)预检 - 想只取实部?别急着
.real—— 若虚部是1e-16级,那是浮点误差,可安全舍去;但若虚部和实部量级相当,说明就是复特征值 - 排序需求?
eig()不保证顺序,常用idx = np.argsort(w.real)再索引w[idx]和v[:, idx]
性能与精度:选 eig() 还是 eigh()?
如果矩阵是实对称(或复厄米),必须用 numpy.linalg.eigh() —— 它更快、更准、特征值严格为实数。
立即学习“Python免费学习笔记(深入)”;
-
eigh()时间复杂度约比eig()低一半,且误差通常小 2–3 个数量级 - 即使你“知道”矩阵对称,也别绕过检查直接用
eig():浮点运算可能导致A - A.T有微小非零项,这时eigh()仍能稳定工作 - 注意:
eigh()总按特征值升序返回,eig()无序
真正卡住人的往往不是函数怎么写,而是没确认输入矩阵的数学性质——形状、秩、对称性、条件数。跑之前花 10 秒查一下 A.shape、np.linalg.matrix_rank(A)、np.max(np.abs(A - A.T)),比反复调试报错快得多。


















