NumPy - 特征向量
什么是特征向量?
特征向量是与矩阵相关的特殊向量,提供有关矩阵属性的信息。
在线性代数中,如果 A 是方阵,则与特征值 对应的特征向量 v 是满足方程 −
的非零向量。Av = v
这意味着,当矩阵 A 与向量 v 相乘时,结果与向量 v 乘以标量 相同。
计算特征向量NumPy
NumPy 提供了 numpy.linalg.eig() 函数来计算方阵的特征值和特征向量。让我们通过一个例子来了解这个函数是如何工作的。
示例
在本例中,矩阵 A 的特征值分别为 3 和 2。相应的特征向量显示在输出中 -
import numpy as np # 定义一个 2x2 矩阵 A = np.array([[4, -2], [1, 1]]) # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(A) print("特征值:", eigenvalues) print("特征向量: ", eigenvectors)
输出numpy.linalg.eig() 函数包含两个数组:一个用于存储特征值,一个用于存储特征向量。
特征值数组包含矩阵的特征值,特征向量数组的每一列代表与各个特征值对应的特征向量 -
特征值:[3. 2.] 特征向量: [[ 0.89442719 0.70710678] [ 0.4472136 -0.70710678]]
特征向量的性质
特征向量有几个重要的性质,它们是:-
- 线性:对应于不同特征值的特征向量是线性无关的。
- 可伸缩性:特征向量的任何标量倍数也是对应于同一特征值的特征向量。
- 不变性:在矩阵定义的线性变换下,特征向量保持不变(最多为标量倍数)。
- 正交性:在对于对称矩阵,不同特征值对应的特征向量是正交的。
特征向量的应用
特征向量的应用非常广泛,它们是:
- 主成分分析 (PCA): 用于数据分析和机器学习中的降维。
- 稳定性分析: 用于控制理论,以分析系统的稳定性。
- 量子力学: 用于求解薛定谔方程并确定系统的能级。
- 振动分析: 用于工程分析结构的固有频率。
- 图论: 用于分析图和网络的属性。
示例:特征向量3x3 矩阵的特征值和特征向量 -
以下示例中,我们使用 NumPy 计算 3x3 矩阵的特征值和特征向量 -
import numpy as np # 定义一个 3x3 矩阵 B = np.array([[1, 2, 3], [0, 1, 4], [5, 6, 0]]) # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(B) print("特征值:", eigenvalues) print("特征向量: ", eigenvectors)
结果如下 -
特征值:[-5.2296696 -0.02635282 7.25602242] 特征向量: [[ 0.22578016 -0.75769839 -0.49927017] [ 0.52634845 0.63212771 -0.46674201] [-0.81974424 -0.16219652 -0.72998712]]
对称矩阵和实特征向量
对称矩阵是指等于其转置矩阵的矩阵(即 A = AT)。对称矩阵的特征值和特征向量具有一些特殊性质 -
- 实特征值:对称矩阵的特征值始终为实数。
- 正交特征向量:对称矩阵中对应于不同特征值的特征向量是正交的。
示例
计算对称矩阵的特征值和特征向量 -
import numpy as np # 定义对称矩阵 C = np.array([[4, 1, 1], [1, 4, 1], [1, 1, 4]]) # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(C) print("特征值:", eigenvalues) print("特征向量: ", eigenvectors)
以下是上述代码的输出 −
特征值: [6. 3. 3.] 特征向量: [[-0.57735027 -0.81649658 -0.15430335] [-0.57735027 0.40824829 -0.6172134 ] [-0.57735027 0.40824829 0.77151675]]
特征向量与对角化
如果方阵A可以写成−,则称其可对角化。
A = PDP-1
其中,D是包含A特征值的对角矩阵,并且P 是一个矩阵,其列是 A 的特征向量。
示例
让我们看看如何使用 NumPy 对矩阵进行对角化 -
import numpy as np # 定义一个矩阵 D = np.array([[2, 0, 0], [1, 3, 0], [4, 5, 6]]) # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(D) # 特征值的对角矩阵 D_diag = np.diag(eigenvalues) # 重建原始矩阵 reconstructed_D = eigenvectors @ D_diag @ np.linalg.inv(特征向量) print("原始矩阵: ", D) print("重构矩阵: ", reconstructed_D)
原始矩阵已成功利用其特征值和特征向量重构,并演示了对角化的过程 -
原始矩阵: [[2 0 0] [1 3 0] [4 5 6]] 重构矩阵: [[2. 0. 0.] [1. 3. 0.] [4. 5. 6.]]