在许多应用程序中,使用其他表示形式分解矩阵非常有用。SciPy支持多种分解,并不是所有的都会用到,本文根据实际使用情况逐步添加测试用例。
1、特征值和特征向量特征值-特征向量问题是最常用的线性代数运算之一。在一种流行的形式中,特征值-特征向量问题是找到一些方阵A标量lamda和相应的向量 v, 这样:
例如,考虑找到矩阵的特征值和特征向量:
特征多项式是:
A的特征值为:
当A为方阵时,有:
B=I,中间为特征值组成的对角阵。根据定义,特征向量仅定义为恒定比例因子。在 SciPy 中,选择特征向量的比例因子使得:
每个特征值对应的特征向量可以使用原始方程找到,然后可以找到与这些特征值相关的特征向量:
import numpy as np
from scipy import linalg
A = np.array([[1, 5, 2], [2, 4, 1], [3, 6, 2]])
la, v = linalg.eig(A)
lamda1, lamda2, lamda3 = la
print("la:", [lamda1, lamda2, lamda3]) # 特征值lamda
print("v1:", v[:, 0]) # 第一列
print("v2:", v[:, 1]) # 第二列
print("v3:", v[:, 2]) # 第三列
print("|v|^2:", np.sum(abs(v ** 2), axis=0)) # eigenvectors are unitary
结果:
la: [(7.957+0j), (-1.257+0j), (0.299+0j)] v1: [-0.5297175 -0.44941741 -0.71932146] v2: [-0.90730751 0.28662547 0.30763439] v3: [ 0.28380519 -0.39012063 0.87593408] |v|^2:[1. 1. 1.]2、奇异值分解
奇异值分解(SVD)可以被认为是特征值问题对非平方矩阵的扩展:
示例:
import numpy as np
from scipy import linalg
A = np.array([[1, 2, 3], [4, 5, 6]])
M, N = A.shape
U, s, Vh = linalg.svd(A)
Sig = linalg.diagsvd(s, M, N)
U, Vh = U, Vh
print("U:", U)
print("Sig:", Sig)
print("Vh:", Vh)
print("check:", U.dot(Sig.dot(Vh))) # check computation
结果:
U: [[-0.3863177 0.92236578] [-0.92236578 -0.3863177 ]] Sig: [[9.508032 0. 0. ] [0. 0.77286964 0. ]] Vh: [[-0.42866713 -0.56630692 -0.7039467 ] [-0.80596391 -0.11238241 0.58119908] [ 0.40824829 -0.81649658 0.40824829]] check: [[1. 2. 3.] [4. 5. 6.]]3、LU分解
LU分解为M*N矩阵A作为:
如果执行 LU 分解的目的是求解线性系统,linalg.lu_factor则应使用该命令,然后重复应用该命令 linalg.lu_solve来求解每个新右手边的系统。
4、Cholesky 分解Cholesky 分解是适用于 Hermitian 正定矩阵的 LU 分解的特例。分解A为:
该命令linalg.cholesky计算 Cholesky 分解。为了使用 Cholesky 分解来求解方程组,还有一些linalg.cho_factor与 linalg.cho_solveLU 分解对应物类似的例程。
5、QR分解QR 分解(有时称为极分解)适用于任何M*N数组并找到一个M*M酉矩阵Q和M*N上梯形矩阵R, 这样:
请注意,如果 SVDA已知,则可以找到 QR 分解。
在 SciPy 中,独立算法用于查找 QR 和 SVD 分解。QR 分解的命令是linalg.qr。
6、Schur分解对于一个正方形M*N矩阵A,Schur 分解找到(不一定是唯一的)矩阵T和Z, 这样:
该命令linalg.schur查找 Schur 分解,而该命令linalg.rsf2csf转换 和从真正的 Schur 形式到复杂的 Schur 形式。
7、插值分解scipy.linalg.interpolative包含用于计算矩阵的插值分解 (ID) 的例程。对于矩阵A因式分解:
可以看scipy.linalg.interpolative了解详细用法。
参考:
1、SciPy 用户指南
SciPy User Guide — SciPy v1.8.0 Manual



