一、矩阵逆(Matrix Inverse)核心概念
1️⃣ 数学定义
对于n阶方阵A ,若存在矩阵 A − 1 A^{-1} A−1使得:
A ⋅ A − 1 = I A \cdot A^{-1} = I A⋅A−1=I
其中I为单位矩阵,则称A为可逆矩阵 , A − 1 A^{-1} A−1为A的逆矩阵。
2️⃣ 可逆条件
- 行列式非零 : det ( A ) ≠ 0 \det(A) \neq 0 det(A)=0
- 满秩:矩阵的秩等于阶数
- 特征值全非零
二、代码解析
python
a = np.array([[1, 2],
[3, 4]])
print(np.linalg.inv(a))
# 输出:[[-2. 1. ]
# [ 1.5 -0.5]]
验证计算正确性:
python
print(a @ np.linalg.inv(a))
# 应近似单位矩阵(可能有微小误差):
# [[1.0000000e+00 0.0000000e+00]
# [8.8817842e-16 1.0000000e+00]]
三、不可逆矩阵处理
1️⃣ 判断矩阵是否可逆
python
# 计算行列式
det = np.linalg.det(a)
if abs(det) > 1e-6: # 考虑浮点误差
inv_a = np.linalg.inv(a)
else:
print("矩阵不可逆!")
2️⃣ 伪逆矩阵(应对不可逆情况)
python
# 使用Moore-Penrose伪逆
pseudo_inv = np.linalg.pinv(a)
四、工程应用场景
应用场景 | 说明 | 代码示例 |
---|---|---|
线性方程组求解 | A x = b Ax = b Ax=b → x = A − 1 b x = A^{-1}b x=A−1b | x = np.linalg.inv(A) @ b |
坐标变换 | 逆向变换矩阵计算 | transform_inv = np.linalg.inv(transform_matrix) |
白化处理 | 数据预处理中的去相关操作 | whitening = inv(cov_matrix) @ data |
五、不同矩阵求逆方法对比
方法 | 优点 | 缺点 | 时间复杂度 |
---|---|---|---|
高斯消元法 | 精确解 | 仅适用于小型矩阵 | O(n³) |
LU分解 | 可复用分解结果 | 需要矩阵可逆 | O(n³) |
伪逆 | 处理奇异矩阵 | 计算成本较高 | O(n³) |
六、实际案例:线性回归解析解
1️⃣ 正规方程
θ = ( X T X ) − 1 X T y \theta = (X^TX)^{-1}X^Ty θ=(XTX)−1XTy
2️⃣ NumPy实现
python
X = np.array([[1, 2],
[1, 3]])
y = np.array([4, 5])
# 计算参数θ
theta = np.linalg.inv(X.T @ X) @ X.T @ y
print(theta) # 输出:[2. 1.] → y = 2 + 1*x
七、数值稳定性建议
1️⃣ 避免直接求逆
推荐使用 np.linalg.solve
更稳定:
python
# 代替 theta = inv(X.T@X) @ X.T@y
theta = np.linalg.solve(X.T @ X, X.T @ y)
2️⃣ 条件数检查
python
cond_num = np.linalg.cond(a)
if cond_num > 1e10:
print("矩阵接近奇异!")
八、常见错误排查
-
非方阵求逆:
python# 错误示例 a = np.array([[1,2,3], [4,5,6]]) np.linalg.inv(a) # 触发LinAlgError
-
精度损失:
pythona = np.array([[1e-10, 0], [0, 1e-10]]) inv_a = np.linalg.inv(a) # 结果可能包含极大数值