趋近智
手动求解特征方程有助于培养直觉,但对于机器学习中遇到的矩阵而言并不实用。对于计算任务,可以利用NumPy等数值计算库高效地找到特征值和特征向量。
numpy.linalg.eigNumPy的线性代数模块linalg包含eig()函数,它正是我们所需要的。它接受一个方阵作为输入,并返回两个NumPy对象:
让我们从一个简单的2x2矩阵开始。考虑变换矩阵 A:
A=(41−21)现在,我们使用NumPy来找到它的特征值和特征向量。
import numpy as np
# 定义我们的方阵
A = np.array([[4, -2],
[1, 1]])
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:")
print(eigenvalues)
print("\n特征向量(每列为一个特征向量):")
print(eigenvectors)
运行此代码会产生以下输出:
特征值:
[3. 2.]
特征向量(每列为一个特征向量):
[[0.89442719 0.70710678]
[0.4472136 0.70710678]]
从这个结果中,我们可以识别出我们的特征值-特征向量对:
请注意,NumPy返回的特征向量是单位向量,这表示它们的长度(L2范数)为1。这是数值计算库中的一种标准做法,因为特征向量的方向才是主要考量,而不是其大小。
为了确认我们的结果,我们可以检查它们是否满足定义方程 Av=λv。让我们为第一个特征值 λ1=3 及其特征向量 v1 进行测试。
首先,我们从eigenvectors矩阵中分离出特征向量。记住,它是第一列。
# 分离第一个特征值和特征向量
lambda1 = eigenvalues[0]
v1 = eigenvectors[:, 0] # 第一列
print("Lambda 1:", lambda1)
print("向量 1:", v1)
现在,我们来计算方程的两边。
# 方程的左边:A @ v1
left_side = A @ v1
# 方程的右边:lambda1 * v1
right_side = lambda1 * v1
print("\nA @ v1 =", left_side)
print("lambda1 * v1 =", right_side)
输出将是:
A @ v1 = [2.68328157 1.34164079]
lambda1 * v1 = [2.68328157 1.34164079]
这两个结果是相同的,确认我们找到了有效的特征值和特征向量对。您可以对第二对(λ2=2 和 v2)执行相同的检查,以进一步验证结果。
我们可以将这种关系可视化,以更好地理解“方向不变”的含义。以下图表显示了原始特征向量 v1(蓝色)和变换后的向量 Av1(橙色)。
原始特征向量 v1 和经过变换 Av1 得到的向量。两个向量都位于从原点延伸的完全相同的直线上。变换只是将向量按其特征值(λ1=3)的因子进行了缩放。
正如图表所示,将矩阵 A 作用于其特征向量 v1 并没有使其旋转。它只是将其拉伸,使其指向相同的方向。新向量的长度是原始向量长度的三倍,这与特征值 λ1=3 完全对应。这就是特征方程的几何意义的体现。
计算线性变换主轴的这种能力是一个有用的工具。在最后一章中,我们将看到这个过程如何构成主成分分析(PCA)的核心,这是一种在机器学习中广泛使用的降维技术。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造