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]]
特征值和特征向量的性质
特征值和特征向量有几个重要的性质。它们是 −
- 线性: 对应于不同特征值的特征向量是线性无关的。
- 行列式关系: 矩阵的特征值乘积等于其行列式。
- 迹关系: 矩阵的特征值之和等于其迹(对角线元素之和)。
- 相似变换: 如果矩阵 A 与矩阵 B 相似(即,对于某个可逆矩阵 P,B = P-1AP),则 A 和 B 具有相同的特征值。
应用特征值和特征向量
特征值和特征向量有许多应用,例如:-
- 主成分分析 (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(eigenvectors) print("原始矩阵: ", D) print("重构矩阵: ", reconstructed_D)
原始矩阵已成功利用其特征值和特征向量重构,并演示了对角化的过程 -
原始矩阵: [[2 0 0] [1 3 0] [4 5 6]] 重构矩阵: [[2. 0. 0.] [1. 3. 0.] [4. 5. 6.]]